hola, aver si puedo explicarte y que me entiendas, todas las ventanas , como ser un picturebox un commadbuton un textbox un formulario etc. reciven mensajes como por ejemplo click mousedown, repintado, etc. una forma de poder ver cuales son estos mensajes lo puedes hacer de esta forma
por ejemplo para ver los mensajes que recive un formulario
en un modulo
y en un formulario
bien como veras lo que hace este codigo es interceptar todos los mensajes que le son enviados al formulario, como por ejemplo cuando mueves el mouse, le das click , lo cierras, etc.
e inclusive puedes evitar que estos eventos se den, por ejemplo:
cambias la funcion WindowProc y la dejas asi
El formulario dejara de recivir el evento Form_MouseDown oviamente con el boton izquierdo
por ejemplo si pones en el formulario te vas a dar cuenta
como veras lo que hace es si uMsg es igual a la constnte WM_LBUTTONDOWN entonces no permite recivir el mensage al forulario.
si te fijas la constante WM_LBUTTONDOWN no es mas que el mensage Hex(uMsg) osea Hex(521) = &H201, con lo que hay tienes como saber cual es el mensage recivido, ahora existe listados de constantes para hacer que esto sea mas legible y entendible, una aplicacion muy completa con muchas constatne es el ApiViewer 2004.
Nota: no e podido nunca de esta forma interceptar los mensajes de una ventana que no alla sido creada por mi aplicacion por ejemplo interceptar el notepad, si alguien save como se hace que avise
(ya se que los mensajes serian los mismos, pero se podrian hacer muchas cosas como por ejemplo evitarlos)
bien todo esto es para llegar a como saber que mensage enviar a otra aplicacion para ello se utiliza SendMessage osea si pudes saber que mensajes recives puedes saber que mensage enviar
con respecto al tema del apagado o mensage para cerrar una aplicacion, pues no encontre dicho mensage, si bien con la constante WM_CLOSE lo cierra, no supe como aplicar el unloadmode
te paso unas constantes muy utiles ( estan en tipo enum, pero bien vos ya sabras como usarlas)
alunas constantes mas y un poco mas de informacion
http://www.canalvisualbasic.net/forum/forum_posts.asp?TID=29194
Saludos
por ejemplo para ver los mensajes que recive un formulario
en un modulo
Código [Seleccionar]
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private 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
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal Msg As Long, _
wParam As Any, _
lParam As Any) As Long
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookWindow(hwnd As Long)
PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookWindow(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
Debug.Print uMsg, wParam, lParam
End Function
y en un formulario
Código [Seleccionar]
Private Sub Form_Load()
HookWindow Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookWindow Me.hwnd
End Sub
bien como veras lo que hace este codigo es interceptar todos los mensajes que le son enviados al formulario, como por ejemplo cuando mueves el mouse, le das click , lo cierras, etc.
e inclusive puedes evitar que estos eventos se den, por ejemplo:
cambias la funcion WindowProc y la dejas asi
Código [Seleccionar]
Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Const WM_LBUTTONDOWN = &H201
If uMsg <> WM_LBUTTONDOWN Then
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
Else
Debug.Print uMsg, wParam, lParam
End If
End Function
El formulario dejara de recivir el evento Form_MouseDown oviamente con el boton izquierdo
por ejemplo si pones en el formulario te vas a dar cuenta
Código [Seleccionar]
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
MsgBox "no me puedo mostrar"
End Sub
como veras lo que hace es si uMsg es igual a la constnte WM_LBUTTONDOWN entonces no permite recivir el mensage al forulario.
si te fijas la constante WM_LBUTTONDOWN no es mas que el mensage Hex(uMsg) osea Hex(521) = &H201, con lo que hay tienes como saber cual es el mensage recivido, ahora existe listados de constantes para hacer que esto sea mas legible y entendible, una aplicacion muy completa con muchas constatne es el ApiViewer 2004.
Nota: no e podido nunca de esta forma interceptar los mensajes de una ventana que no alla sido creada por mi aplicacion por ejemplo interceptar el notepad, si alguien save como se hace que avise
(ya se que los mensajes serian los mismos, pero se podrian hacer muchas cosas como por ejemplo evitarlos)
bien todo esto es para llegar a como saber que mensage enviar a otra aplicacion para ello se utiliza SendMessage osea si pudes saber que mensajes recives puedes saber que mensage enviar
con respecto al tema del apagado o mensage para cerrar una aplicacion, pues no encontre dicho mensage, si bien con la constante WM_CLOSE lo cierra, no supe como aplicar el unloadmode
Código [Seleccionar]
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal Msg As Long, _
wParam As Any, _
lParam As Any) As Long
Private Sub Command1_Click()
WM_CLOSE = &H10
SendMessage Me.hwnd, WM_CLOSE, 1, 1
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
MsgBox UnloadMode
End Sub
te paso unas constantes muy utiles ( estan en tipo enum, pero bien vos ya sabras como usarlas)
Código [Seleccionar]
'------------------------------------------------------------------------------
' Enumeración con los mensajes de windows (Window Messages)
'
' Esta lista está sacada de ApiViewer 2004,
' algunas declaraciones están en el fichero Win32API.txt
'
' En los casos que se indique #if ... es que son para otras versiones de Windows:
' #if(WINVER >= 0x0400) Será Windows NT 4 y superior y Windows 98
' #if(WINVER >= 0x0500) Será Windows 2000 y superior (Windows NT 5) (creo)
Public Enum eWSCWM
WM_NULL = &H0
WM_CREATE = &H1
WM_DESTROY = &H2
WM_MOVE = &H3
WM_SIZE = &H5
WM_ACTIVATE = &H6
WM_SETFOCUS = &H7
WM_KILLFOCUS = &H8
WM_ENABLE = &HA
WM_SETREDRAW = &HB
WM_SETTEXT = &HC
WM_GETTEXT = &HD
WM_GETTEXTLENGTH = &HE
WM_PAINT = &HF
WM_CLOSE = &H10
WM_QUERYENDSESSION = &H11
WM_QUIT = &H12
WM_QUERYOPEN = &H13
WM_ERASEBKGND = &H14
WM_SYSCOLORCHANGE = &H15
WM_ENDSESSION = &H16
WM_SHOWWINDOW = &H18
WM_WININICHANGE = &H1A
' #if(WINVER >= 0x0400)
WM_SETTINGCHANGE = WM_WININICHANGE
' #endif /* WINVER >= 0x0400 */
WM_DEVMODECHANGE = &H1B
WM_ACTIVATEAPP = &H1C
WM_FONTCHANGE = &H1D
WM_TIMECHANGE = &H1E
WM_CANCELMODE = &H1F
WM_SETCURSOR = &H20
WM_MOUSEACTIVATE = &H21
WM_CHILDACTIVATE = &H22
WM_QUEUESYNC = &H23
WM_GETMINMAXINFO = &H24
WM_PAINTICON = &H26
WM_ICONERASEBKGND = &H27
WM_NEXTDLGCTL = &H28
WM_SPOOLERSTATUS = &H2A
WM_DRAWITEM = &H2B
WM_MEASUREITEM = &H2C
WM_DELETEITEM = &H2D
WM_VKEYTOITEM = &H2E
WM_CHARTOITEM = &H2F
WM_SETFONT = &H30
WM_GETFONT = &H31
WM_SETHOTKEY = &H32
WM_GETHOTKEY = &H33
WM_QUERYDRAGICON = &H37
WM_COMPAREITEM = &H39
' #if(WINVER >= 0x0500)
WM_GETOBJECT = &H3D
' #endif /* WINVER >= 0x0500 */
WM_COMPACTING = &H41
WM_WINDOWPOSCHANGING = &H46
WM_WINDOWPOSCHANGED = &H47
WM_POWER = &H48
WM_COPYDATA = &H4A
WM_CANCELJOURNAL = &H4B
' #if(WINVER >= 0x0400)
WM_NOTIFY = &H4E
WM_INPUTLANGCHANGEREQUEST = &H50
WM_INPUTLANGCHANGE = &H51
WM_TCARD = &H52
WM_HELP = &H53
WM_USERCHANGED = &H54
WM_NOTIFYFORMAT = &H55
'
'#define NFR_ANSI 1
'#define NFR_UNICODE 2
'#define NF_QUERY 3
'#define NF_REQUERY 4
'
WM_CONTEXTMENU = &H7B
WM_STYLECHANGING = &H7C
WM_STYLECHANGED = &H7D
WM_DISPLAYCHANGE = &H7E
WM_GETICON = &H7F
WM_SETICON = &H80
' #endif /* WINVER >= 0x0400 */
'
WM_NCCREATE = &H81
WM_NCDESTROY = &H82
WM_NCCALCSIZE = &H83
WM_NCHITTEST = &H84
WM_NCPAINT = &H85
WM_NCACTIVATE = &H86
WM_GETDLGCODE = &H87
WM_NCMOUSEMOVE = &HA0
WM_NCLBUTTONDOWN = &HA1
WM_NCLBUTTONUP = &HA2
WM_NCLBUTTONDBLCLK = &HA3
WM_NCRBUTTONDOWN = &HA4
WM_NCRBUTTONUP = &HA5
WM_NCRBUTTONDBLCLK = &HA6
WM_NCMBUTTONDOWN = &HA7
WM_NCMBUTTONUP = &HA8
WM_NCMBUTTONDBLCLK = &HA9
'
'WM_KEYFIRST = &H100
WM_KEYDOWN = &H100
WM_KEYUP = &H101
WM_CHAR = &H102
WM_DEADCHAR = &H103
WM_SYSKEYDOWN = &H104
WM_SYSKEYUP = &H105
WM_SYSCHAR = &H106
WM_SYSDEADCHAR = &H107
'WM_KEYLAST = &H108
'
' #if(WINVER >= 0x0400)
WM_IME_STARTCOMPOSITION = &H10D
WM_IME_ENDCOMPOSITION = &H10E
WM_IME_COMPOSITION = &H10F
'WM_IME_KEYLAST = &H10F
' #endif /* WINVER >= 0x0400 */
'
WM_INITDIALOG = &H110
WM_COMMAND = &H111
WM_SYSCOMMAND = &H112
WM_TIMER = &H113
WM_HSCROLL = &H114
WM_VSCROLL = &H115
WM_INITMENU = &H116
WM_INITMENUPOPUP = &H117
WM_MENUSELECT = &H11F
WM_MENUCHAR = &H120
WM_ENTERIDLE = &H121
'
' #if(WINVER >= 0x0500)
WM_MENURBUTTONUP = &H122
WM_MENUDRAG = &H123
WM_MENUGETOBJECT = &H124
WM_UNINITMENUPOPUP = &H125
WM_MENUCOMMAND = &H126
' #endif /* WINVER >= 0x0500 */
'
WM_CTLCOLORMSGBOX = &H132
WM_CTLCOLOREDIT = &H133
WM_CTLCOLORLISTBOX = &H134
WM_CTLCOLORBTN = &H135
WM_CTLCOLORDLG = &H136
WM_CTLCOLORSCROLLBAR = &H137
WM_CTLCOLORSTATIC = &H138
'WM_MOUSEFIRST = &H200
WM_MOUSEMOVE = &H200
WM_LBUTTONDOWN = &H201
WM_LBUTTONUP = &H202
WM_LBUTTONDBLCLK = &H203
WM_RBUTTONDOWN = &H204
WM_RBUTTONUP = &H205
WM_RBUTTONDBLCLK = &H206
WM_MBUTTONDOWN = &H207
WM_MBUTTONUP = &H208
WM_MBUTTONDBLCLK = &H209
' #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
WM_MOUSEWHEEL = &H20A
'WM_MOUSELAST = &H20A
' #else
'WM_MOUSELAST = &H209
' #endif /* if (_WIN32_WINNT < 0x0400) */
WM_PARENTNOTIFY = &H210
WM_ENTERMENULOOP = &H211
WM_EXITMENULOOP = &H212
' #if(WINVER >= 0x0400)
WM_NEXTMENU = &H213
WM_SIZING = &H214
WM_CAPTURECHANGED = &H215
WM_MOVING = &H216
WM_POWERBROADCAST = &H218
WM_DEVICECHANGE = &H219
' #endif /* WINVER >= 0x0400 */
WM_MDICREATE = &H220
WM_MDIDESTROY = &H221
WM_MDIACTIVATE = &H222
WM_MDIRESTORE = &H223
WM_MDINEXT = &H224
WM_MDIMAXIMIZE = &H225
WM_MDITILE = &H226
WM_MDICASCADE = &H227
WM_MDIICONARRANGE = &H228
WM_MDIGETACTIVE = &H229
WM_MDISETMENU = &H230
WM_DROPFILES = &H233
WM_MDIREFRESHMENU = &H234
' #if(WINVER >= 0x0400)
WM_IME_SETCONTEXT = &H281
WM_IME_NOTIFY = &H282
WM_IME_CONTROL = &H283
WM_IME_COMPOSITIONFULL = &H284
WM_IME_SELECT = &H285
WM_IME_CHAR = &H286
' #endif /* WINVER >= 0x0400 */
' #if(WINVER >= 0x0500)
WM_IME_REQUEST = &H288
' #endif /* WINVER >= 0x0500 */
' #if(WINVER >= 0x0400)
WM_IME_KEYDOWN = &H290
WM_IME_KEYUP = &H291
' #endif /* WINVER >= 0x0400 */
'
' #if(_WIN32_WINNT >= 0x0400)
WM_MOUSEHOVER = &H2A1
WM_MOUSELEAVE = &H2A3
' #endif /* _WIN32_WINNT >= 0x0400 */
WM_CUT = &H300
WM_COPY = &H301
WM_PASTE = &H302
WM_CLEAR = &H303
WM_UNDO = &H304
WM_RENDERFORMAT = &H305
WM_RENDERALLFORMATS = &H306
WM_DESTROYCLIPBOARD = &H307
WM_DRAWCLIPBOARD = &H308
WM_PAINTCLIPBOARD = &H309
WM_VSCROLLCLIPBOARD = &H30A
WM_SIZECLIPBOARD = &H30B
WM_ASKCBFORMATNAME = &H30C
WM_CHANGECBCHAIN = &H30D
WM_HSCROLLCLIPBOARD = &H30E
WM_QUERYNEWPALETTE = &H30F
WM_PALETTEISCHANGING = &H310
WM_PALETTECHANGED = &H311
WM_HOTKEY = &H312
'
' #if(WINVER >= 0x0400)
WM_PRINT = &H317
WM_PRINTCLIENT = &H318
'
WM_HANDHELDFIRST = &H358
WM_HANDHELDLAST = &H35F
'
WM_AFXFIRST = &H360
WM_AFXLAST = &H37F
' #endif /* WINVER >= 0x0400 */
'
WM_PENWINFIRST = &H380
WM_PENWINLAST = &H38F
'
' #if(WINVER >= 0x0400)
WM_APP = &H8000
' #endif /* WINVER >= 0x0400 */
' NOTE: All Message Numbers below 0x0400 are RESERVED.
' Private Window Messages Start Here:
WM_USER = &H400
End Enum
Public Enum eWSCHitTest
' WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
HTERROR = (-2)
HTTRANSPARENT = (-1)
HTNOWHERE = 0
HTCLIENT = 1
HTCAPTION = 2
HTSYSMENU = 3
HTGROWBOX = 4
HTSIZE = HTGROWBOX
HTMENU = 5
HTHSCROLL = 6
HTVSCROLL = 7
HTMINBUTTON = 8
HTMAXBUTTON = 9
HTLEFT = 10
HTRIGHT = 11
HTTOP = 12
HTTOPLEFT = 13
HTTOPRIGHT = 14
HTBOTTOM = 15
HTBOTTOMLEFT = 16
HTBOTTOMRIGHT = 17
HTBORDER = 18
HTREDUCE = HTMINBUTTON
HTZOOM = HTMAXBUTTON
HTSIZEFIRST = HTLEFT
HTSIZELAST = HTBOTTOMRIGHT
End Enum
Public Enum eWSCMF
' Menú Flags para WM_MENUSELECT
'MF_UNCHECKED = &H0&
MF_GRAYED = &H1&
MF_DISABLED = &H2&
MF_BITMAP = &H4&
MF_CHECKED = &H8&
MF_POPUP = &H10&
MF_HILITE = &H80&
MF_OWNERDRAW = &H100&
MF_SYSMENU = &H2000&
MF_MOUSESELECT = &H8000&
End Enum
' Valores de fuSource para el mensaje WM_ENTERIDLE
Public Enum eWSCMSFG
MSGF_DIALOGBOX = 0
MSGF_MENU = 2
End Enum
' Mensajes varios
Public Enum eWSCMisc
' WM_ACTIVATE state values
WA_INACTIVE = 0
WA_ACTIVE = 1
WA_CLICKACTIVE = 2
' wParam for WM_POWER window message and DRV_POWER driver notification
PWR_OK = 1
PWR_FAIL = (-1)
PWR_SUSPENDREQUEST = 1
PWR_SUSPENDRESUME = 2
PWR_CRITICALRESUME = 3
' WM_SYNCTASK Commands
ST_BEGINSWP = 0
ST_ENDSWP = 1
' SendMessageTimeout values
SMTO_NORMAL = &H0
SMTO_BLOCK = &H1
SMTO_ABORTIFHUNG = &H2
' WM_MOUSEACTIVATE Return Codes
MA_ACTIVATE = 1
MA_ACTIVATEANDEAT = 2
MA_NOACTIVATE = 3
MA_NOACTIVATEANDEAT = 4
' WM_SIZE message wParam values
SIZE_RESTORED = 0
SIZE_MINIMIZED = 1
SIZE_MAXIMIZED = 2
SIZE_MAXSHOW = 3
SIZE_MAXHIDE = 4
' WM_NCCALCSIZE return flags
WVR_ALIGNTOP = &H10
WVR_ALIGNLEFT = &H20
WVR_ALIGNBOTTOM = &H40
WVR_ALIGNRIGHT = &H80
WVR_HREDRAW = &H100
WVR_VREDRAW = &H200
WVR_REDRAW = (WVR_HREDRAW Or WVR_VREDRAW)
WVR_VALIDRECTS = &H400
' Key State Masks for Mouse Messages
MK_LBUTTON = &H1
MK_RBUTTON = &H2
MK_SHIFT = &H4
MK_CONTROL = &H8
MK_MBUTTON = &H10
' Constantes para el menú del sistema
SC_RESTORE = &HF120&
SC_MOVE = &HF010&
SC_SIZE = &HF000&
SC_MINIMIZE = &HF020&
SC_MAXIMIZE = &HF030&
SC_CLOSE = &HF060&
alunas constantes mas y un poco mas de informacion
http://www.canalvisualbasic.net/forum/forum_posts.asp?TID=29194
Saludos