Systemweiter Keylistener?

Hallo liebe Community,

Ich habe mal wieder ein Problem und hoffe ihr könnt mir helfen, da ich entweder zu blöd bin um richtig zu suchen, oder ich nicht das richtige gefunden habe:

Folgende Situation:

Wir sind grade in einem Programm (in meinem Fall ein Spiel) und wollen zu bestimmten Zeiten akkustische Signale haben -> Funktioniert
Jetzt wollen wir aber selbstständig den Timer reseten können, ohne das Spiel zu verlassen, da bleibt dann nur ein globaler, systemweiter KeyListener -> Da komme ich nicht weiter.

Folgende Sachen habe ich bereits gefunden:
Einen KeyListener der Applikationsweit funktioniert -> Getestet, funktioniert

Ich habe auch schon alles sonst soweit fertig, momentan funktioniert das Reseten allerdings nur über einen Button, was unschön ist, da hier das Spiel minimiert werden muss.

Ich hoffe ihr könnt mir helfen und schonmal danke im vorraus.
Gruß Gossi

Anhang:
Das hier soll dann quasi ausgeführt werden:

		if (e.getSource().equals(buttonReset)) {
			actTime = defaultTimer; // <- Diese Zeile
		}
	}```

Basteln des Anzeigestrings:
```	private String getTime(final int seconds) {
		int sec = seconds % 60;
		int min = (seconds - sec) / 60;
		String time = "";
		if (min < 10) {
			time = "0" + min + ":";
		} else {
			time = min + ":";
		}
		if (sec < 10) {
			time += "0" + sec;
		} else {
			time += sec;
		}
		return time;
	}```

Aktion dies ausgeführt wird (jede Sekunde) um zu checken ob ein Signal ausgegeben werden muss:
```	if (actTime > 0) {
		actTime --;
		if (actTime == 30) {
			Toolkit.getDefaultToolkit().beep();
			System.out.println("SOON");
		} else if (actTime == 0) {
			Toolkit.getDefaultToolkit().beep();
			System.out.println("Hurry");
		}
	}```

Meinst du Systemweit im Sinne von global? Google mal Gloabaler Keyboard Hook java oder so. Mit Java selbst kannst du das nicht machen (falls es wirklich Systemweit sein soll). Allerdings kannst du mit JNI eine C Funktion aufrufen die für dich einen Hook anmeldet. Gibt aber auch schon fertige Projekte dafür.

Ok, danke schaue ich mir mal an.

Und mit Systemweit meine ich, dass JEDES drücken einer bestimmten Taste registriert werden soll, also im Javaprogramm, Word, Browser und eben auch beim Spielen, wo es am wichtigsten wäre.

Jo das nennt sich Keyboard Hook. Hatte vor einem Jahr auch mal so etwas für ein Macromanager verwendet. Eine gute anlaufstelle (wenn du es selbst schreiben willst) ist die Seite codeproject. Da gab es damals mehrere solcher Projekte bis in kleinste Detail beschrieben.

Da gab es im alten Forum ein Project glaub war von The_S (bin mir nicht sicher) das das Global Key Listener vl findest du es noch

*** Edit ***

Ja habs grad gefunden war The_S und hat das Project auch auf seiner Webseite http://softk.de/opensource/jglobalkeylistener.html

Also, ich habe mir jetzt das JNativeHook Framework runtergeladen und damit funktioniert es, soweit ich es testen kann super :smiley:
(Nur wenn ich in der VM bin gehts nicht, ist aber nicht schlimm)

Folgenden Code nutze ich:

	public void nativeKeyPressed(final NativeKeyEvent e) {
		if (e.getKeyCode() == NativeKeyEvent.VK_CONTROL) {
			if (!strg) {
				System.out.println("Hallo");
				strg = true;
			}
		} else if (e.getKeyCode() == NativeKeyEvent.VK_NUMPAD0 && strg) {
			this.actTime = defaultTimer;
		}
	}

	@Override
	public void nativeKeyReleased(final NativeKeyEvent e) {
		if (e.getKeyCode() == NativeKeyEvent.VK_CONTROL) {
			if (strg) {
				strg = false;
			}
		}
	}

	@Override
	public void nativeKeyTyped(final NativeKeyEvent e) {
		// System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
	}```

Danke nochmals für die schnelle Hilfe :)

Musst auch achten für welche Platformen das ist. Hooks sind nie Platformunabhängig.

Ah, okay, aber sowohl die VM, alsauch das normale BS sind XP.

Bin jetzt zu Hause und baus grad unter Win 7 nach, mal sehen obs hier auch geht :smiley:

Hier ist nochmal was Platformunabhängiges (auch wenn da etwas mit der Synchronisation nicht passen mag), das funktioniert, muss aber zyklisch abgefragt werden, was natürlich auch gleich auf dem EDT gemacht werden kann, wobei man sich die Synchronisation dann auch sparen kann.

http://forum.byte-welt.net/threads/11313-Thread-Zeug?p=84591&viewfull=1#post84591

[QUOTE=Gossi]Ah, okay, aber sowohl die VM, alsauch das normale BS sind XP.

[/QUOTE]
Naja ne VM ist ja dazu da Programme zu isolieren, daher würde das nicht grade für die VM sprechen wenn man das trotzdem mitbekommen würde. Du meldest den Hook ja auch in dem BS der VM an und nicht in dem anderen. Aber wenn du in der VM mehrere Programme offen hast sollte er das dann auch merken.