Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Hook para capturar items de Menus

Estas en el tema de Hook para capturar items de Menus en el foro de Visual Basic clásico en Foros del Web. Hola a todos: Tengo un formulario con 10 menus cada uno de los cuales tiene varios items. Necesito que al mover el raton encima de ...
  #1 (permalink)  
Antiguo 10/07/2009, 09:23
 
Fecha de Ingreso: agosto-2006
Mensajes: 45
Antigüedad: 17 años, 8 meses
Puntos: 0
Hook para capturar items de Menus

Hola a todos:

Tengo un formulario con 10 menus cada uno de los cuales tiene varios items.

Necesito que al mover el raton encima de uno de los items de cualquiera de los 10 menus, me capture en que item esta y de que menu.

Tengo un ejemplo que hace esto (creo que se llama Hook), pero solo lo hace con los items de un menu.

Pongo aqui el codigo para que os sea mas facil decirme que debo corregir para que este ejmplo haga lo que quiero.


---- El formulario ---------------

Option Explicit


Private Sub Form_Load()

' propiedades del panel donde se visualizará el texto _
al pasar el mouse en el Submenu
StatusBar1.Panels(1).Width = 8400
StatusBar1.Panels(1).Alignment = sbrLeft
StatusBar1.Panels(1).Style = sbrText
' instala el Hook
OldProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)

Me.Caption = "Hook para interceptar el Mousemove en un Menu"
End Sub


Private Sub Form_Unload(Cancel As Integer)
' Quita el Hook
Call SetWindowLong(hWnd, GWL_WNDPROC, OldProc)
End Sub
------------------------------------------------------------------------

----El modulo .bas ------------

Option Explicit

Public OldProc As Long

Public Const MF_POPUP = &H10&
Public Const WM_MENUSELECT = &H11F

' Función Api que Instala el Hook
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

' Procedimiento de ventana para leer los mensajes
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 As Long = -4

Public Function WindowProc(ByVal hWnd As Long, _
ByVal iMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

' texto a mostrar en el panel del Statusbar
Dim texto As String * 128
' Handle del menu o SubMenu
Dim h_Menu As Integer

' chequea los mensajes
''''''''''''''''''''''''
Select Case iMsg

Case WM_MENUSELECT
' Cuando se cierra el menú, lParam vale 0 y sale de la función
If lParam = 0 Then
Form1.StatusBar1.Panels.Item(1).Text = ""
Exit Function
End If
' Get the low word from wParam. _
This contains the command ID or position of the menu entry.
h_Menu = GetLowWord(wParam)

' If the highlighted menu is the top of a poup menu, pass menu item by position.
If (GetHighWord(wParam) And MF_POPUP) = MF_POPUP Then
' If the MF_POPUP bit was set in the high word, the menu item has a
' sub-menu attached to it. The position in h_Menu will be useless.
Form1.StatusBar1.Panels.Item(1).Text = "Menu Archivo"
''''''''''''''''''''''''''''''''
'Chequea el Id del Menu ESTO SOLO DETECTA EL PRIMER MENU
Else
Select Case h_Menu
'Submenu 1
Case 2
texto = "Buscar y Abrir un archivo"
'Submenu 2
Case 3
texto = "Guardar el trabajo "
'Submenu 3
Case 4
texto = "Imprimir el trabajo actual"
Case 5
texto = "Salir completamente del programa"
'Case 6
' otros menues
Case Else
texto = ""
End Select
' asigna el texto al panel
Form1.StatusBar1.Panels(1).Text = texto

End If
'continua leyendo los mensajes
WindowProc = CallWindowProc(OldProc, hWnd, iMsg, wParam, lParam)
Case Else
WindowProc = CallWindowProc(OldProc, hWnd, iMsg, wParam, lParam)
End Select

End Function

Public Function GetLowWord(Word As Long)
GetLowWord = CInt("&H" & Right$(Hex$(Word), 4))
End Function

Public Function GetHighWord(Word As Long)
GetHighWord = CInt("&H" & Left$(Hex$(Word), 4))
End Function

-----------------------------------------------------------------------------
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:00.