# Gesamten Keyboardinput auslesen



## ImmNek (21. Mai 2010)

Hallo Leute,

ich habe wieder mal ein kleines Problem. Ich möchte gerne den Keyboardinput auslesen, aber damit es nicht zu einfach wird, muss es der ganze sein. Also auch der Input, der in einem anderen Programm eingegeben wird. Ein KeyListener funzt da leider nicht. In C ist es kein Problem, aber in Java krieg ich es einfach nicht hin und Google hilft mir auch nicht wirklich weiter.

Freundliche Grüsse

ImmNek


----------



## Ark (22. Mai 2010)

java.awt.Robot?

… Hm, okay. Ich dachte gerade, die Klasse wäre auch für solche Sachen geeignet … ^^

Ark


----------



## Schandro (22. Mai 2010)

hier wurde mal der *GlobalKeyListener *verlinkt, der mit ner nativen Library zusammenarbeitet. Leider find ich den Link net mehr..


----------



## kay73 (23. Mai 2010)

ImmNek hat gesagt.:


> Ich möchte gerne den Keyboardinput auslesen, aber damit es nicht zu einfach wird, muss es der ganze sein. Also auch der Input, der in einem anderen Programm eingegeben wird.


Windows? Systemweit jeder Tastendruck? Das ist richtig Arbeit. Stichworte: JNI, Windows Hook API.


----------



## ImmNek (24. Mai 2010)

Genau, Windows, Sysmteweit jeder Tastendruck ;-) Wenn es so einfach wäre, dann bräuchte ich ja au keine Hilfe ;-) Naja, ich habe mir gedacht vielleicht gibt es eine Funktion, welche die Tastatur auslesen kann, dann könnte ich zB alle 10 ms mal die Tastatur abfragen und die Logik selber implementieren.

Aber auf jede Fall möchte ich euch für die Stichworte danken, ich werde mal meine Google-Research damit anreichern ;-)

Schönen Pfingstmontag die Herren und Damen

ImmNek


----------



## Schandro (24. Mai 2010)

Hab den GlobalKeyListener wieder gefunden:
http://schandro.com/pdl/GlobalKeyListener.zip
nur zum klarstellen: ich bin *nicht* der Autor! Ich find die Projektseite net mehr.


----------



## eRaaaa (24. Mai 2010)

Schandro hat gesagt.:


> Hab den GlobalKeyListener wieder gefunden:
> http://schandro.com/pdl/GlobalKeyListener.zip
> nur zum klarstellen: ich bin *nicht* der Autor! Ich find die Projektseite net mehr.



SoftK.de | Stefan Kiesel - JGlobalKeyListener

:toll:


----------



## ImmNek (24. Mai 2010)

Nun, ich habe mal nach GlobalKeyListener gegooglet und siehe da, ich habe einen interessanten Treffer in diesem Forum gelandet: http://www.java-forum.org/awt-swing-swt/47494-global-key-listener-erstellen.html

Man soll das den AWTEventListener nicht benutzen, aber das wird von allem gesagt, womit man richtig lustige Sachen machen kann.


----------



## ImmNek (24. Mai 2010)

Dankeschön, den werde ich mit gleich einmal ansehen, ich denke, dann ist dieser Beitrag wohl erschlagen.

Vielen Dank nochmal für die schnelle Hilfe.


----------



## kay73 (24. Mai 2010)

ImmNek hat gesagt.:


> Genau, Windows, Sysmteweit jeder Tastendruck ;-)


Da hilft dir aber ein AWTEventListener nicht weiter. Damit habe ich auch mal rumgespielt, um sowas wie eine geheime Tastenfolge á la [ALT]+"DEBUG" applikationsweit abzufangen. (Was auch gut klappt). 

Wenn jemand Text in die Notepad.exe tippt, bekommt das ein Java-Programm nicht mit. Da muss man schon mehr Aufwand treiben.

*Und lass die Finger von diesem "JGlobalKeyLogger"!!!!*

Der fragt alle 5 Sekunden das gesamte Keyboard ab und hofft auf gut Glück erraten zu können, ob eine Taste gerade gedrückt ist.

Windows hat für sowas eine richtige API: Hooks (Windows)

Hier hat einer an einem Java Wrapper dafür gearbeitet, der auf den ersten Blick ganz ordentlich aussieht:
Java Native Interface (JNI) - <b>Keyboard or Mouse hook in JNI</b> [Locked]


----------



## ImmNek (24. Mai 2010)

Hehe, ich hätte jetzt jetzt auch einfach alle 10 ms oder so das Keyboard abgefragt. Wieso ist das so schlecht? so kriege ich sicher au alles mit. Wenn es natürlich auch sehr viel simpler geht, dann habe ich auch nichts dagegen  Aber ich habe mir das ganze eigentlich sehr einfach vorgestellt, auch wenn es nicht sehr elegant ist und ich vielleicht wieder einmal etwas implementiere, was schon lange programmiert wurde, und das wahrscheinlich schon sehr gut


----------



## kay73 (12. Jun 2010)

Ist die Sache noch aktuell?


----------



## ImmNek (12. Jun 2010)

Hallo

Ja, die Sache ist auf jeden Fall noch aktuell.

Gruss


----------



## kay73 (12. Jun 2010)

Das JNA-Projekt bildet u. a. Windows DLLs (inklusive Hook-API) nach Java ab und hat genau einen solchen KeyLogger als Demo. Der ist direkt lauffähig und funktionierte unter Windows XP auf Anhieb. 

Du brauchst diese beiden JARs im Klassenpfad:
jna.jar
platform.jar

```
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.User32.HHOOK;
import com.sun.jna.platform.win32.User32.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.User32.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.User32.MSG;
import com.sun.jna.platform.win32.W32API.HMODULE;
import com.sun.jna.platform.win32.W32API.LRESULT;
import com.sun.jna.platform.win32.W32API.WPARAM;

/** Sample implementation of a low-level keyboard hook on W32. */

public class KeyHook {

	private static volatile boolean quit;
	private static HHOOK hhk;
	private static LowLevelKeyboardProc keyboardHook;

	public static void main(String[] args) {

		final User32 lib = User32.INSTANCE;
		HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);

		keyboardHook = new LowLevelKeyboardProc() {

			public LRESULT callback(int nCode, WPARAM wParam,
					KBDLLHOOKSTRUCT info) {

				if (nCode >= 0) {
					switch (wParam.intValue()) {
					case User32.WM_KEYUP:
					case User32.WM_KEYDOWN:
					case User32.WM_SYSKEYUP:
					case User32.WM_SYSKEYDOWN:

						System.err.println("in callback, key=" + info.vkCode);

						if (info.vkCode == 81) {
							quit = true;
						}
					}
				}

				return lib .CallNextHookEx(hhk, nCode, wParam, info.getPointer());
			}
		};

		hhk = lib.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
		System.out.println("Keyboard hook installed, type anywhere, 'q' to quit");

		new Thread() {

			public void run() {

				while (!quit) {

					try {
						Thread.sleep(10);
					} catch (Exception e) {
					}
				}

				System.err.println("unhook and exit");
				lib.UnhookWindowsHookEx(hhk);
				System.exit(0);
			}
		}.start();

		// This bit never returns from GetMessage

		int result;
		MSG msg = new MSG();

		while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {

			if (result == -1) {
				System.err.println("error in get message");
				break;
			}

			else {
				System.err.println("got message");
				lib.TranslateMessage(msg);
				lib.DispatchMessage(msg);
			}
		}

		lib.UnhookWindowsHookEx(hhk);
	}
}
```
Das Source-File gibt es auch im Pfad /jna/jnalib/contrib/src/w32keyhook/KeyHook.java der JNA Sourcen. Du musst dafür die Sourcen aus dem SVN von jna auschecken. Hier steht wie es geht. Die interessanten Zeilen sind 24-46. Du musst aber unbedingt in Deiner Implementierung auch am Ende 
	
	
	
	





```
UnhookWindowsHookEx()
```
 aufrufen, denn dieser Code gräbt sich zur Laufzeit ins System.


----------



## ImmNek (13. Jun 2010)

Vielen Dank. Das sieht sehr hilfreich aus. Dann muss ich nicht selber mit solchen Hooks rummachen.


----------

