Mensaje enviado por "Gustavo Genovese" <ggenovese@ciudad.com.ar>
Se que muchos lo han preguntado a la lista, sin obtener respuesta (me incluyo)
Un codigo de ejemplo de como hacerlo es este:
Crear un proyecto nuevo y agregar un form.
En este form, agregar un menu, con un caption cualquiera, y darle un nombre
por ejemplo MNUPRUEBA
En el codigo del formulario, ingresar el siguiente codigo:
Option Explicit
Private Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" _
(ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long, ByVal wIDNewItem As Long, _
ByVal lpNewItem As Any) As Long
Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long
Const SC_SIZE = &HF000
Const SC_MOVE = &HF010
Const SC_MINIMIZE = &HF020
Const SC_MAXIMIZE = &HF030
Const SC_CLOSE = &HF060
Const SC_RESTORE = &HF120
Private Sub Form_Load()
Dim hMenu&, Success&
Dim i%
hMenu = GetSystemMenu(hWnd, 0)
Success = InsertMenu(hMenu, SC_CLOSE - 2, &H0, 128, mnuprueba.Caption)
procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Agregar un modulo y escribir el siguiente código:
Option Explicit
Public Const WM_SYSCOMMAND = &H112
Public procOld As Long
Public Declare Function CallWindowProc& Lib "user32" _
Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc&, _
ByVal hWnd&, ByVal Msg&, _
ByVal wParam&, ByVal lParam&)
Public Declare Function SetWindowLong& Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hWnd&, _
ByVal nIndex&, ByVal dwNewLong&)
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
Select Case iMsg
Case WM_SYSCOMMAND
If wParam = 128 Then 'valor asignado en InsertMenu
MsgBox "Usted hizo clik en el menu personalizado"
End If
End Select
WindowProc = CallWindowProc(procOld, _
hWnd, iMsg, wParam, lParam)
End Function
Espero les sirva
Saludos
Gustavo Genovese
ggenovese@ciudad.com.ar
Mendoza - Argentina