Autor
|
Tema: Control de los mensajes de Windows (Leído 5,209 veces)
|
~~
|
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  1S4ludo
|
|
|
En línea
|
|
|
|
LeandroA
|
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 saver 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 saver que mensajes recives puedes saver 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=29194Saludos
|
|
|
En línea
|
|
|
|
~~
|
|
|
|
En línea
|
|
|
|
Meg
Desconectado
Mensajes: 462
|
wuaaa k crack XDD , na tio te lo as currao de verdad 
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
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.
|
|
|
En línea
|
|
|
|
LeandroA
|
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
|
|
« Última modificación: 29 Abril 2007, 02:56 am por LeandroA »
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
 se jugaron con el manual!!! muy bien 
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
para ser un hook global tiene que estar en una dll.
|
|
|
En línea
|
|
|
|
sopeta
Desconectado
Mensajes: 4
|
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?!!!!
|
|
|
En línea
|
|
|
|
cobein
|
fijate con entersizemove a versi lo resolves
|
|
|
En línea
|
|
|
|
|
|