Hola wenas
Llevo algun tiempo preguntandome una cosa. Todos conocemos esos programas q controlan remotamente el winamp o ocultan procesos del task mediante el envio de mensajes, y si habeis programado alguna vez una ventana aunke sea en C++ sabreis q windows manda mensajes a nuestra ventanita al hacer click por ej y nosotros podemos usar esto para, por ejemplo maximizar ventanas ajenas a la nuestra, pero, como podemos conocer estos mensajes??
No me refiero a como minimizar una ventana "remotamente" si no a saber q mensaje manda windows al apagarse para cerrar todos los procesos por ejemplo o para cualkier otra cosa???
Alguien lo sabe :huh:
1S4ludo
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
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
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
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
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
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)
'------------------------------------------------------------------------------
' 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 (http://www.canalvisualbasic.net/forum/forum_posts.asp?TID=29194)
Saludos
:o :o :o :o :o :o :o :o :o :o
Clap, clap clap, q bien explicado!!!
Muchas gracias por toda la información, te lo has currado!! Voy a empezar a hacer pruevas con todos estos datos, a ver si consigo interceptar mensajes de otras aplicaciones y manejarlas ;D ;D
De nuevo gracias (esto se merece chincheta)
1S4ludo
wuaaa k crack XDD , na tio te lo as currao de verdad :)
si quieres interceptar mensajes de otras aplicaciones tendras que usar un hook, como es logico a tu formulario solo son enviados mensajes de lo que pasa dentro de el.
Cita de: - en 28 Abril 2007, 22:47 PM
si quieres interceptar mensajes de otras aplicaciones tendras que usar un hook, como es logico a tu formulario solo son enviados mensajes de lo que pasa dentro de el.
Hola bien e provado con hook, pero no consigo interceptar nada, lo unico que logro es colgar el otro programa, nose quizas lo estoy haciendo mal, si bien hay que usar el hInstance y el ThreadID, el
hInstance lo consegui de esta manera
hInstance =GetWindowLong(ElHwnd, GWL_HINSTANCE)y
Thread = GetCurrentThreadId() (el cual creo que es incorrecto, osea para obtenerlo de otra aplicacion, este solo me devuelve el mio no?)ahora suponiendo que creo una aplicacion y copio su App.hInstance Y App.ThreadID y los paso como parametros, como te decia se cuelga el programa , no el mio sino el que intento interceptar
asi es como lo estoy haciendo (El ejemplo esta con la propia aplicacion la cual si funciona pero aver si nos echas una mano para usarlo con otra), en este caso es para capturar los mensajes del teclado
En un modulo
Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Const GWL_HINSTANCE = (-6)
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As Long
Public Function HookProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print idHook, wParam, lParam
HookProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
End Function
en un formulario
Private Const WH_MSGFILTER As Long = -1
Private Const WH_MIN As Long = -1
Private Const WH_MINHOOK As Long = WH_MIN
Private Const WH_JOURNALRECORD As Long = 0
Private Const WH_JOURNALPLAYBACK As Long = 1
Private Const WH_KEYBOARD As Long = 2
Private Const WH_GETMESSAGE As Long = 3
Private Const WH_CALLWNDPROC As Long = 4
Private Const WH_CBT As Long = 5
Private Const WH_SYSMSGFILTER As Long = 6
Private Const WH_MOUSE As Long = 7
Private Const WH_HARDWARE As Long = 8
Private Const WH_DEBUG As Long = 9
Private Const WH_SHELL As Long = 10
Private Const WH_FOREGROUNDIDLE As Long = 11
Private Const WH_MAX As Long = 11
Private Const WH_MAXHOOK As Long = WH_MAX
Private Const WH_CALLWNDPROCRET As Long = 12
Private Const WH_KEYBOARD_LL As Long = 13
Private Const WH_MOUSE_LL As Long = 14
Private Sub Form_Load()
'hInst = App.hInstance
hInst = GetWindowLong(Me.hwnd, GWL_HINSTANCE)
'Thread = App.ThreadID
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf HookProc, hInst, Thread)
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx hHook
End Sub
Espero tu respuesta, Saludos
:o se jugaron con el manual!!!
muy bien ;)
para ser un hook global tiene que estar en una dll.
Gente, como va, ya se que este tema es viejo, pero bueno, estoy teniendo un problema, yo quiero evitar que se produzca el evento resize hasta que no se termine de soltar el mouse.
entonces estoy usando el wm_sizing=&h214
pero me lo realiza igual, osea
la idea es que cuando entra a windowproc si es ese evento, que salga de la funcion, sino que lo devuelva...
osea, mientras arrasta la pantalla que no haga nada, y cuando suelta que deje pasar el evento resize del formulario...pero no me esta saliendo
alguien me da una mano por favor?!!!!
fijate con entersizemove a versi lo resolves