Tastatureingaben systemweit abfangen ?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Tastatureingaben systemweit abfangen ?

    Hallo Leute,

    ich arbeite zur Zeit an meinem Terminmanager, er befindet sich bereits im Betastatus. Mein Problem ist folgendes:

    Das Programm läuft auf Wunsch im Hintergrund, und prüft jede Stunde die gesamte Termindatenbank ab ob ein Termin bevorsteht. (die Abfrageroutine befindet sich in einer Schleife, in der danach ein Sleep von genau einer Stunde eingebaut ist), Wenn das der Fall ist, erscheint eine Messagebox, die darauf hinweist. Aber während das Programm im Hintergrund läuft, soll es mittels einer Tastenkombination wieder aufgerufen werden können. Man erahnt es, ich muss also sämtliche Eingaben systemweit abfangen können. Dazu habe ich die API - Funktion "GetAsyncKeyState" genommen. Soweit klappt das ja ganz gut.

    Das Problem ist aber, dass das gesamte Programm wegen dem 'Sleep' komplett pausiert wird, worauf die Tastenabfrage auch nicht mehr greift. Der Code dazu sieht folgendermaßen aus:

    Quellcode

    1. //Die Tastaturabfrage:
    2. int Keylogger ()
    3. {
    4. SHORT key [256];
    5. while(true)
    6. {
    7. Sleep (25);
    8. for(int i=0;i<256;i++)
    9. {
    10. key [i] = GetAsyncKeyState (i);
    11. }
    12. for (int j=0;j<256;j++)
    13. {
    14. if(key[j] == -32767)
    15. {
    16. return j; break;
    17. }
    18. }
    19. }
    20. }
    Alles anzeigen


    Bei gedrückter Taste wird der jeweilige ASCII - Code zurückgegeben.

    Und hier die (vereinfachte) Abfrageschleife:

    Quellcode

    1. void HideConsole ()
    2. {
    3. while (Keylogger () != 97) // In diesem Fall entspricht dies der Taste 'a'
    4. {
    5. //Hier die Abfrageroutine .....
    6. //Und nun das Sleep :
    7. Sleep (3600000); //Ab hier 'schläft' das gesamte Programm, auch die tasten werden nicht mehr abgefragt.
    8. //Jetzt wird die Abfrage erneut gestartet ... (In diesem Zeitraum funzt die Tastaturabfrage logischerweise, allerdings nur ein paar Millisekunden)
    9. }
    10. }


    Ich hoffe, ich habe euch das (einigermaßen) verstämdlich erklärt, da das Zeug mittlerweile doch etwas komplex geworden ist ;) Achso, und das Programm könnt ihr euch bei meiner Homepage runterladen.

    http://codingarena.co.funpic.de
  • Der Code ist nicht unzuverlässig, er ist auch noch innefizient. Du fragst in regelmäßigen Abständen den Tastaturpuffer ab und wartest. Das heißt dein Programm macht immer irgendwas, egal ob nun die Tastatur benutzt wird oder nicht. Der richtige Weg um an Tastendrücke zu kommen, ist nichts zu machen und sich vom Betriebsystem jedesmal eine Nachricht schicken zu lassen, welche Taste(n) grade gedrückt wird. Wenn also keine Taste gedrückt wird, muss dein Programm nichts machen (auch nicht warten) und das System kann ihm Rechenleistung entziehen und anders verteilen. Die Funktion die du dir angucken solltest ist SetWindowsHookEx() (und CallNextHookEx()). Da deine Anwendung unkritisch ist, würde auch ein JournalRecord reichen, sodass du das auch nicht in eine DLL auslagern musst.

    Allerdings Frage ich mich ob du das wirklich machen möchtest. Dich interessieren ja nur ganz wenige Tasten, also Hotkeys. Die Funktion die du also eigentlich brauchst ist GlobalAddAtom() und RegisterHotkey()

    Das sleep von einer Stunde ist auch nicht gut, ich würde mich da auch nach alternativen umsehen.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Danke dir für die Antwort. Mit dem Keyboardhook habe ich mich auch schon mal auseinandergesetzt, aber es wurde mir schlicht zu kompliziert. Ich muss sagen, dass ich mit der WinAPI leider (noch) nichts bzw. wenig am Hut habe, weswegen die Erklärungen in der MSDN relativ wenig bringen ....

    Das Prinzip ist mir soweit auch klar. Das zweite Problem ist aber, dass wenn das Sleep aufgerufen wird, reagiert mein Prog auf die Eingaben nicht mehr, da alles pausiert wird, sehe ich das richtig oder ? Es muss irgendeine Funktion her, die das Programm warten lässt, aber nicht 'schlafen'. Während der Pause sollte es auch weitere Funktionen ausführen können. Haja, nur kenne ich leider keine Alternative zum Sleep, könntest du mir da eine nennen ?