Global Hook

Nebuchadnezar

Erfahrenes Mitglied
Ich hätte da mal eine Frage:
Wenn ich zum Beispiel Global Tastatureingaben einfangen will wofür brauch ich da einen Tastaturhook
wenn ich es doch direkt mit GetAsncKeyState machen kann? Abgesehen davon dass es Äußerst umständlicht ist. Des weiteren bin ich ja mit GetAsyncKeyState nicht an einen bestimmten thread gebunden und für globalen Tastaturhook brauch ich ja ne eigene dll.
Wenns mit Hook "schöner" ist, könnt ihr mir mal dafür einen Beispielcode posten?
thx;)
 
Iczelion

hier das Tut über Windows-Hooks - ist zwar in ASM aber das liest sich wie C - sollte kein Problem sein.

invoke bedeutet das eine API-Funktion aufgerufen wird.

der Unterschied zu deiner Funktion ist der:
Deine Funktion musst du selber jedesmal aufrufen um so die Keys einzeln zu überprüfen und ob sie seit dem letzten mal als die Funktion aufgerufen wurde gedrückt wurden. Das nennt sich polling und kostet massiv CPU-Zeit - auch wenn nichts passiert.
Der WindowsHook sorgt dafür, dass deine Funktion jedesmal aufgerufen wird, wenn ein entsprechendes WindowsEvent auftritt. Wenn keines auftritt, wird nichts gemacht und kostet auch keine Zeit. Wichtig ist blos: CallNextHook aufrufen. Sonst sollte es recht simpel sein.
 
Zuletzt bearbeitet:
passt danke erst mal.
Nächste frage: Egal wie ich es löse ob ichs mit Hook oder eben polling mach wird ein und dasselbe ereignis 2mal ausgelöst - also zb: Irgendeine Taste wird gedrückt und dann soll ein Beep über den Systemspeaker ausgeben werden. Das Interessante:
Der Beep wird 2mal ausgegeben. Egal ob mit hook oder mit GetAsyncKeyState(i). Hast du vielleicht eine Erklärung dazu?
 
ok habs mittlerweile selber heraußen:
einfach lParam auf einen Wert über 0 überprüfen da die 2 Messages von KB_DOWN und KB_UP oder so in der art Resultieren. Wenn das 31 Bit gesetzt ist bedeutet es KB_UP und wird aufgrund des auf 1 gesetzten MSB als negative Binärzahl interpretiert.
Code:
LRESULT CALLBACK KeyboardProc(
    int code,	        // hook code
    WPARAM wParam,	// virtual-key code
    LPARAM lParam 	// keystroke-message information
   )
{

	itoa(lParam,buf,10);
  if(code == HC_ACTION)
  {
	  if((lParam > 0))
		 Beep(700,1);
		  
  }


	  
	  
  
    
  return 0;
}

hoffe ich hab das so richtig verstanden.
 
hmm jetzt wirds überhaupt unlösbar.
Ich weis überhaupt nicht wie ich das lösen soll, dass das Programm erkennt, wenn shift gedrückt gehalten wird, dass die folgende ausgabe sich dadurch ändert.
 
Wenn du eine Message erhältst, die dich interessiert, kannst du zusätzlich mit GetAsyncKeyState() prüfen, ob augenblicklich die Shifttaste gedrückt ist (VK_LSHIFT bzw. VK_RSHIFT ). Das sollte dein Problem lösen.
 
oder du setzt bei SHIFT_DOWN bzw. ALT_DOWN usw. ein Flag shift, alt, ... und bei SHIFT_UP usw. löschst du es wieder.
 
hmm muss ich probieren. Das Problem ist das, dass ich erkenn dass Shift gedrückt ist und dass die folgenden Messages ignoriert werden bis eine andere Taste kommt. Zusätzlich muss ich registrieren wenn ein Key up event kommt da ich sonst ein Pfuschprogramm hab - man drückt shift, lasst shift los und drückt einen Buchstaben. Ohne Keyup Ereignis wirkt es so als wäre der jeweilige Buchstabe großgeschrieben - ist er aber nicht.
btw: hab einen äußerst interessanten Beitrag über Hooking von einem Profi gefunden:
Jeder der an Hooking interessiert ist dem kann ich diesen Beitrag ans Herz legen:
http://www.codeproject.com/system/hooksys.asp

Zusatz:
Ich widerhole mich nur ungern aber:
Qualität von Redmond: Wollt wieder an dem Hookprogramm rumbasteln und was is - Tote Hose:

ompilierung läuft...
HooksDlg.cpp
c:\hooks\hooksdlg.cpp(4) : fatal error C1001: INTERNER COMPILER- FEHLER
(Compiler-Datei "msc1.cpp", Zeile 1794)
Bitte wählen Sie im Menü "?" von Visual C++
den Befehl "Software Service", oder öffnen Sie die Hilfedatei für den Software Service, um weitere Informationen zu erhalten
Fehler beim Ausführen von cl.exe.

Hooks.exe - 1 Fehler, 0 Warnung(en)

vielleicht weis wer weiter... danke
 
Zuletzt bearbeitet:
1: Problem gelöst... keine ahnung wie: Beispielprog nochmal als Original genommen die Änderungen reinkopiert und siehe da es geht wieder.
2.: den Tastaturhook hab ich schon längst - kann alles erkennen mein Problem ist die verarbeitung dass ich wenn das Programm shift erkennt das Prog dazu bringe die folgenden Buchstaben großzuschreiben. Ich komm einfach nicht dahinter.
hier ein link zum ganzen Programm wäre schön wenn sich wär dem Problem annehmen könnt :-) danke
hooking --- hoffe jetzt klappts
 
Zuletzt bearbeitet:
Zurück