[R] Hook clavier sur un processus avec WH_KEYBOARD

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

[R] Hook clavier sur un processus avec WH_KEYBOARD

#1

Message 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.
Modifié en dernier par orax le dim. 19 juil. 2009 19:18, modifié 1 fois.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#3

Message 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:
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#5

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#6

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#7

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#8

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

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

#9

Message 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 ;)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#10

Message 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).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre