Ayuda en una función

Iniciado por karmany, 6 Febrero 2006, 00:14 AM

0 Miembros y 1 Visitante están viendo este tema.

karmany

He encontrado una forma de interceptar el menú que sale cuando pulsamos con el botón derecho por ej. en un textbox.
El problema es que hay una función que no entiendo lo que hace, ¿me podéis ayudar?

Hay un formulario con un Textbox, un Command y un módulo.
El código es el siguiente:
En el formulario:
Option Explicit
Private mbCapturado As Boolean
Private Sub Command1_Click()
   If Not mbCapturado Then
        gHW = Text1.hWnd
        Activa
        mbCapturado = True
   Else
        mbCapturado = False
        Desactiva
        gHW = 0
   End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If mbCapturado Then Desactiva
End Sub


En el módulo esto:
Option Explicit

Public Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Const GWL_WNDPROC = (-4)

Public Const WM_CONTEXTMENU = &H7B

Global lpPrevWndProc As Long
Global gHW As Long

Public Sub Activa()
    lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
    AddressOf gWindowProc)
End Sub

Public Sub Desactiva()
  Dim temp As Long
    temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub

Public Function gWindowProc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_CONTEXTMENU Then
        Debug.Print "Interceptado  WM_CONTEXTMENU ( " & Now & ")"
        gWindowProc = True
    Else ' Send all other messages to the default message handler
        gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, _
                    lParam)
    End If
End Function


La función que no entiendo es Function gWindowProc. No sé lo que hace. ¿Es de windows? ¿Es predefinida?
En la primera sentencia if, hace: gWindowProc = True. Viendo esto yo he puesto directamente (dentro de Activa): lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, True), pero se "cuelga" el VB.

Alguien q tenga conocimientos me lo puede explicar un poco??
Muchas gracias.