# Global Hook



## Nebuchadnezar (22. Juli 2004)

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


----------



## squeaker (22. Juli 2004)

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.


----------



## Nebuchadnezar (22. Juli 2004)

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?


----------



## Nebuchadnezar (22. Juli 2004)

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.

```
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.


----------



## Nebuchadnezar (22. Juli 2004)

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.


----------



## Kachelator (23. Juli 2004)

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.


----------



## squeaker (23. Juli 2004)

oder du setzt bei SHIFT_DOWN bzw. ALT_DOWN usw. ein Flag shift, alt, ... und bei SHIFT_UP usw. löschst du es wieder.


----------



## Nebuchadnezar (23. Juli 2004)

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


----------



## squeaker (23. Juli 2004)

hast du jetzt einen Keyboardhook istalliert oder nicht?


----------



## Nebuchadnezar (23. Juli 2004)

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


----------



## squeaker (23. Juli 2004)

ein SHIFT_DOWN zu erkennen sollte kein Problem sein in deiner HOOKPROC. Ein SHIFT_UP sollte doch auch kein Problem sein, oder?

in Pseudocode:


```
int shift=0;

bla hookproc(...) {
   ...
   if (key=SHIFT_DOWN) {
      shift=1;
   }
   if (key=SHIFT_UP) {
     shift=0;
  }
  if (bla) {
    if (shift=0) {
      //in kleinbuchstaben schreiben
    } else {
      //in GROSSBUCHSTABEN schreiben
    }
  }
  CallNextHook();
  return bla;
}
```


----------



## Nebuchadnezar (24. Juli 2004)

hmm soweit bin ich auch schon aber ich bekomms leider nicht hin. In meinem vorigen Post hab ich ans Ende den gesamten Sourcecode als zipfile angehängt.
Wäre toll wenn du mir damit weiterhelfen könntest.

Ok Lösung ist viel einfacher. Sourcecode von einem Keylogger hat mir weitergeholfen


----------



## Test (27. Juli 2004)

> _Original geschrieben von Nebuchadnezar _
> *Ok Lösung ist viel einfacher.  *



Da dein Link nicht mehr funktioniert, wollte ich mal fragen ob du den fertigen Code hier mal direkt als Anhang posten könntest?


----------



## Nebuchadnezar (27. Juli 2004)

Ist mir neu dass der nicht mehr funktioniert aber ich habs grad probiert er funzzt wirklich nicht. Ist interessant. Ich werd das mal fixen.

Das mitm Posten is deppat weils ein win32 Projekt mit mehreren cpp dateien is.
Hmm sollt eh gehen. Bei mir hat es zwar auch nicht gefunzzt aber jetzt geht komischerweise wieder.


----------



## Kachelator (27. Juli 2004)

> Das mitm Posten is deppat weils ein win32 Projekt mit mehreren cpp dateien is.


  Kennst du Winzip?


----------



## Nebuchadnezar (30. Juli 2004)

OkOk hab nicht bemerkt dass ich direkt ne Datei anhängen kann an die Beiträge ^^.
Und noch ein bisschen upgedated. Wenn manches etwas umständlich ist, sagts mir, hab leider keine andere Möglichkeit dafür gefunden - zb: Das "§" Zeichen. 
Die MessageBox die jedes eingefangene Zeichen auffängt ist momentan nur eine Pfuschlösung aus bequemlichkeit, da es schneller zum kontrollieren ist, als die Zeichen in eine Datei hineinzuschreiben.


----------

