Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: BlackZeroX en 13 Diciembre 2010, 07:38 am



Título: GetMessage() y DispatchMessage()
Publicado por: BlackZeroX en 13 Diciembre 2010, 07:38 am
.
Bueno ando con un rollo en el vb6 y es que ando creando un UC ( ya tiene mucho que llevo con esto pero no he tenido mucho tiempo para terminarlo ), mi problema es que en el UC resivo los mensajes con GetMessage y los dejo fluir con DispatchMessage pero he aqui el problema en DispatchMessage cundo termino el form donde tengo el UC se queda todo el programa en dicha linea y por esta linea no se puede cerrar el programa o form en cuestion.

En pocas palabras una alternativa a estas apis cual seria?, las he usado por que estas no me traban de forma innesesaria el programa, en cambio PeekMessage tengo que hacer un Bucle pero este a diferencia de las otras dos apis se le escapan mensajes, por ende no me sirve ademas que tengo que ponerle doevents y cosillas dentro del bucle para que no se coma el procesador.

Este es el codigo, lo programe para que dejara de procesar mensajes si le llegan los mensajes WM_CLOSE o WM_DESTROY, pero esto no me gusta mucho que digamos.

Código
  1.  
  2. '   //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //
  3. '   //  El Objetivo de este proceso es que el Control de Usuario sea Maleable,
  4. '   //  de igual forma por que lo pienso pasar a C++ y esto me ayudara despues,
  5. '   //  se que aqui no se tratan los mensajes si no mas bien en el Callback
  6. '   //  WindProc() pero bueno, es solo una obtativa para vb6 de forma cutre
  7. '   //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //
  8. '   //  ----------------------------------------------------------------------  //
  9. '   //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //
  10. '   //  No es la manera mas Ortodoxa pero asi me evito usar TODO el Procesador...
  11. '   //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //  //
  12.  
  13. Private Sub ProcessMessages()
  14. Dim vMsg                                As Msg
  15. Dim bool_MsgCancel                      As Boolean
  16. Dim Button                              As Integer
  17. Dim tPoint                              As POINTAPI
  18. Dim Shift                               As Integer
  19.  
  20.    bool_MsgCancel = False
  21.  
  22.    Do While GetMessage(vMsg, 0, 0, 0) And bool_MsgCancel = False
  23.        If vMsg.hwnd = UserControl.hwnd Or _
  24.           vMsg.hwnd = VS.hwnd Or _
  25.           vMsg.hwnd = HS.hwnd Then
  26.  
  27.            Select Case vMsg.message
  28.  
  29.                '   //  Mensajes del Mouse
  30.                Case WM.WM_MOUSEWHEEL, WM.WM_MOUSEMOVE, _
  31.                     WM.WM_LBUTTONDBLCLK, WM.WM_LBUTTONDOWN, WM.WM_LBUTTONUP, _
  32.                     WM.WM_RBUTTONDBLCLK, WM.WM_RBUTTONDOWN, WM.WM_RBUTTONUP, _
  33.                     WM.WM_MBUTTONDBLCLK, WM.WM_MBUTTONDOWN, WM.WM_MBUTTONUP
  34.  
  35.                    tPoint = GetCursorRegion
  36.  
  37.                    If vMsg.wParam = MK.MK_CONTROL Then
  38.                        Shift = 2
  39.                    ElseIf vMsg.wParam = MK.MK_SHIFT Then
  40.                        Shift = 1
  41.                    Else
  42.                        Shift = 0
  43.                    End If
  44.  
  45.                    Select Case vMsg.message
  46.                        Case WM.WM_MOUSEWHEEL
  47.                            Debug.Print "WM_MOUSEWHEEL"
  48.                            If vMsg.wParam < 0 Then
  49.                                If (DatosScrollGhost(1).Visible Or VS.Visible) Then
  50.                                    Scroll_V = Priv_SV + int_hRow
  51.                                End If
  52.                            Else
  53.                                If (DatosScrollGhost(0).Visible Or VS.Visible) Then
  54.                                    Scroll_V = Priv_SV - int_hRow
  55.                                End If
  56.                            End If
  57.  
  58.                        Case WM.WM_LBUTTONDBLCLK
  59.                            Debug.Print "WM_LBUTTONDBLCLK"
  60.                            Call lvDblClick
  61.                        Case WM.WM_RBUTTONDBLCLK
  62.                            Debug.Print "WM_RBUTTONDBLCLK"
  63.                            Call lvDblClick
  64.                        Case WM.WM_MBUTTONDBLCLK
  65.                            Debug.Print "WM_MBUTTONDBLCLK"
  66.                            Call lvDblClick
  67.  
  68.                        Case WM.WM_LBUTTONDOWN
  69.                            Debug.Print "WM_LBUTTONDOWN"
  70.                            Button = 1
  71.                            Call lvMouseDown(Button, Shift, tPoint.X, tPoint.Y)
  72.                        Case WM.WM_RBUTTONDOWN
  73.                            Debug.Print "WM_RBUTTONDOWN"
  74.                            Button = 2
  75.                            Call lvMouseDown(Button, Shift, tPoint.X, tPoint.Y)
  76.                        Case WM.WM_MBUTTONDOWN
  77.                            Debug.Print "WM_MBUTTONDOWN"
  78.                            Button = 4
  79.                            Call lvMouseDown(Button, Shift, tPoint.X, tPoint.Y)
  80.  
  81.                        Case WM.WM_LBUTTONUP, WM.WM_RBUTTONUP, WM.WM_MBUTTONUP
  82.                            Debug.Print "WM_LBUTTONUP"
  83.                            Call lvMouseUp(Button, Shift, tPoint.X, tPoint.Y)
  84.                            Call lvClick
  85.                            Button = 0
  86.  
  87.                        Case WM.WM_MOUSEMOVE
  88.                            Debug.Print "WM_MOUSEMOVE"
  89.                            Call lvMouseMove(Button, Shift, tPoint.X, tPoint.Y)
  90.  
  91.                    End Select
  92.  
  93.                '   //  Teclas Pulsadas...
  94.                Case WM.WM_KEYDOWN
  95.                    Debug.Print "WM_KEYDOWN", vMsg.wParam
  96.                    Select Case vMsg.wParam
  97.                        Case VK.VK_UP
  98.                            If DatosScrollGhost(0).Visible Or VS.Visible Then
  99.                                Scroll_V = Priv_SV - int_hRow   'Priv_SV - int_hRow
  100.                            End If
  101.  
  102.                        Case VK.VK_Down
  103.                            If DatosScrollGhost(1).Visible Or VS.Visible Then
  104.                                Scroll_V = Priv_SV + int_hRow   'Priv_SV + int_hRow
  105.                            End If
  106.  
  107.                        Case VK.VK_Left
  108.                            If DatosScrollGhost(3).Visible Or HS.Visible Then
  109.                                Scroll_H = Priv_SH - 20   'Priv_SH - 20
  110.                            End If
  111.  
  112.                        Case VK.VK_RIGHT
  113.                            If DatosScrollGhost(3).Visible Or HS.Visible Then
  114.                                Scroll_H = Priv_SH + 20   'Priv_SH + 20
  115.                            End If
  116.  
  117.                        Case VK.VK_HOME
  118.                            Scroll_V = 0
  119.  
  120.                        Case VK.VK_END
  121.                            If RowVisibleCount < CantRows Then
  122.                                Scroll_V = (CantRows * int_hRow) - (RectLista.Bottom - RectLista.Top)
  123.                            End If
  124.  
  125.                        Case VK.VK_SHIFT
  126.                            cAoDSS = True
  127.                            Shift = 1
  128.  
  129.                        Case VK.VK_CONTROL
  130.                            cAoDSC = True
  131.                            Shift = 2
  132.  
  133.                        Case VK.VK_PRIOR
  134.                            Scroll_V = Priv_SV - RowVisibleCount * int_hRow
  135.  
  136.                        Case VK.VK_NEXT
  137.                            Scroll_V = Priv_SV + RowVisibleCount * int_hRow
  138.  
  139.                    End Select
  140.                    RaiseEvent KeyDown(Int(vMsg.wParam), Shift)
  141.  
  142.                Case WM.WM_KEYUP
  143.                    Debug.Print "WM_KEYUP", vMsg.wParam
  144.                    Select Case vMsg.wParam
  145.                        Case VK.VK_SHIFT
  146.                            cAoDSS = False
  147.                            Shift = 0
  148.  
  149.                        Case VK.VK_CONTROL
  150.                            cAoDSC = False
  151.                            Shift = 0
  152.                    End Select
  153.                    RaiseEvent KeyUp(Int(vMsg.wParam), Shift)
  154.                    RaiseEvent KeyPress(Int(vMsg.wParam))
  155.  
  156.                '   //  Mesajes de la Ventana
  157.                Case WM.WM_ACTIVATE
  158.                    Debug.Print "WM_ACTIVATE"
  159.  
  160.                Case WM.WM_CLOSE, WM.WM_DESTROY
  161.                    Debug.Print "WM_CLOSE", "WM_DESTROY"
  162.                    bool_MsgCancel = True
  163.                    Exit Sub
  164.  
  165.                Case WM.WM_PAINT
  166.                    If vMsg.wParam = 0 Then
  167.                        Call Refresh
  168.                    Else
  169.                        Call RefreshCols(vMsg.lparam)
  170.                    End If
  171.  
  172.                Case WM.WM_ENABLE
  173.                    'wParam
  174.                    '   Indicates whether the window has been enabled or disabled. This parameter is TRUE if the window has been enabled or FALSE if the window has been disabled.
  175.                    'lparam
  176.                    '   This parameter is not used.
  177.                    Debug.Print "WM_ENABLE"
  178.  
  179.                Case Else
  180.  
  181.            End Select
  182.  
  183.        End If
  184.        Call DispatchMessage(vMsg)
  185.        'Call WaitMessage
  186.    Loop
  187. End Sub
  188.  
  189.  

P.D.: Que no sea por subclasificación... aun que si no tengo otra opcion...

Temibles Lunas!¡.


Título: Re: GetMessage() y DispatchMessage()
Publicado por: Karcrack en 13 Diciembre 2010, 15:59 pm
No hay otra opcion que subclasificar... Al menos nadie jamas la ha encontrado.... :xD


Título: Re: GetMessage() y DispatchMessage()
Publicado por: LeandroA en 14 Diciembre 2010, 01:06 am
Yo creo que con tantos msg a interceptar te conviene pasa a una sublcasificación, te va a ser mas efectivo.

Saludos.