Page 1 sur 1

[R] Hook clavier sur un processus avec WH_KEYBOARD

Posté : sam. 18 juil. 2009 23:38
par orax
Bonjour, je cherche à utiliser la fonction _WinAPI_SetWindowsHookEx avec $WH_KEYBOARD pour faire un hook clavier sur un processus (par exemple, notepad).
J'aimerais faire ça sans devoir passer par une DLL externe (est-ce que c'est possible ?).
Le code que j'ai actuellement me fait planter le notepad. :lol: Et le "thread id" du processus (1540 dans l'exemple) est à rentrer manuellement car je n'ai pas encore regardé comment le récupérer automatiquement avec AutoIt...

Code : Tout sélectionner

#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $hKeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
Global $hMod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD, DllCallbackGetPtr($hKeyProc), $hMod, 1540)

While 1
    Sleep(10)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
    MsgBox(0, "", $nCode)
    
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>KeyProc

Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hKeyProc)
EndFunc   ;==>OnAutoItExit
Merci de m'éclairer.

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 00:54
par Tlem
Il me semble avoir déjà mis ce lien récemment pour un sujet similaire. :roll:
Mais le voici de nouveau : http://www.autoitscript.com/forum/index ... t&p=450458

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 01:08
par orax
Je suis allé voir votre lien, mais visiblement il s'agit de WH_KEYBOARD_LL (hook global), alors que je souhaite faire un hook avec WH_KEYBOARD. Il y a une petite nuance. :mrgreen:

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 01:15
par Tlem
Certes, mais si vous lisez le message #26(Jon) et #31(Valik) qui sont deux des plus éminents développeur de AutoIt, vous verrez que d'après eux, cela n'est pas possible. :P

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 02:07
par orax
Jon : 'You can't hook "global" events without a DLL.' est contredit ensuite par GaryFrost : 'Now that autoit has DllCallbackRegister and DllCallbackGetPtr, should be able to do this without the external dll.'
D'ailleurs c'est vrai, j'arrive très bien à faire un hook clavier global sans DLL externe. :P

Valik : 'I think keyboard hooks can only be done as global hooks which means it has to be a DLL.'
Là par contre, j'ai l'impression qu'il dit qu'on ne peut faire que des hooks globaux et qu'il faut passer par une DLL (non ?). Alors que pourtant c'est possible de faire un hook global sans DLL avec DllCallbackGetPtr.

En tout cas, je n'ai pas vu, écrit clairement, que pour faire un hook clavier non global (sur un seul processus) avec WH_KEYBOARD (sans le _LL à la fin !), il fallait une DLL externe... Ou alors j'ai dû louper quelque chose. Encore que... le message de Valik semble s'en rapprocher.

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 02:16
par Tlem
Je ne saurais vous en dire plus, cela dépasse mes connaissances. ;)
C'est juste que j'avais lu ce message qui parlait de ce qui vous intéresse. ;)

Cela dit, rien ne vous empêche de poursuivre la discussion. hihi

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 05:14
par orax
:cry: En fait, j'avais cherché sur ce forum et le forum anglais (sans toujours tout lire...), mais je n'avais rien trouvé. Merci quand même.

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 11:06
par Tlem
Et les UDF de GaryFrost dans ce message : http://www.autoitscript.com/forum/index ... t&p=450718 ?

En lisant le code, je voit ceci :

Code : Tout sélectionner

Global Const $WH_KEYBOARD        = 2
Global Const $WH_KEYBOARD_LL     = 13
Il doit donc être possible d'utiliser ces UDF à votre convenance, non ?

Juste comme ça. En quoi l'utilisation d'une DLL vous poserait problème. C'est le cas de la plupart de tous le programmes Windows ....
Et puis pour 4.5 Ko ce n'est pas la mer à boire. ;)
Hook.dll

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 11:41
par ani
Regarde du coté de la documentation de chez microsoft.

WM_KeyBoard utilise KeyboardProc
WM_KeyBoardLL utilise LowLevelKeyBoardProc

Le LPARAM pour WM_....LL pointe sur la structure KBDLLHOOK alors que le simple demande un paramétre (une valeur), voilà, le pourquoi du plantage ;)

Pour la récupération de l'identifiant, tape "thread id" dans la recherche de l'aide d'autoit ;) _WinAPI_GetCurrentThreadId()/_WinAPI_GetWindowThreadProcessId($hwnd,$PID)

bonne continuation ;)

Re: [..] Hook clavier sur un processus avec WH_KEYBOARD

Posté : dim. 19 juil. 2009 19:17
par orax
Problème résolu : c'est impossible de faire un hook avec WH_KEYBOARD sur un autre processus sans passer par une DLL externe. :cry:
On peut par contre faire un hook sur son propre processus (sur un thread) en mettant 0 comme "ThreadId".

J'ai vu ça ici : MSDN : About Hooks If the application installs a hook procedure for a thread of a different application, the procedure must be in a DLL. For information, see Dynamic-Link Libraries. J'aurais du commencer par lire ça... :oops:

Ce qui est bizarre, c'est qu'ils disent qu'il faut une DLL pour faire un hook global (alors que ça marche sans avec AutoIt...) : A global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module. Bref...
ani a écrit :Pour la récupération de l'identifiant, tape "thread id" dans la recherche de l'aide d'autoit ;) _WinAPI_GetCurrentThreadId()/_WinAPI_GetWindowThreadProcessId($hwnd,$PID)
J'avais essayé GetWindowThreadProcessId mais ça me retournait le PID au lieu du TID (Thread ID).