# MouseListener und KeyListener



## Binabic (30. Mai 2010)

Hallo ich Programmiere nur für den privaten bereich mein zeil ist es ein eigenes Online Spiel zu programieren aberauf dem weg dahin muß ich problematiken so lösen können.

Angefangen habe ich vor etwar 20 Jahren mit dem guten Alten C64 Basic und habe vor einigen Monaten dann einen C++ und einen Java Anfängerkurs besucht.

Ich habe mich dafür entschieden mich auf eine Spache zu konzentrieren und da mir Java leicher von der Hand geht als C++ war es für mich dann klar welche das ist.

Nun zu meinem Problem.

Die listener bindet man ja normalerweise an ein Objekt (Fenster, Button).

Ich möchte eine Klasse die im Hintergrund auf bestimmte Maus und Key evends wartet dabei soll es egal sein welcher Prozess nun Aktiv ist.

Ich habe mehrere tage gegooglt und bin immer nur auf antworten gestossen das dies nur mit C++ geht und mit Java nicht wirklich machbar ist.

Das ist leider etwas das ich nicht wirklich glauben kann den irgendwo muß es eine klasse geben die schon auf die Maus zugreift oder die keyboard und sobald dort aktionen pasieren das  bemerken.

Vorerst geht es mir nur darum zb bei drücken von Alt und rechte maustause  eine aktion durchzuführen und bei shift und linke maustase eine andere aktion durchzuführen.

Kann mir da jemand weiter helfen welche klasse ich mir mal anschauen sollte.
Oder hat jemand eine Idee wie man das umsetzen könnte ich sitze da nun schon mehrer wochen daran aber scheitere daran das ich bei einem Tastendruck Maus oder Keyboard den listener nicht aktiv bekomme sobald ich die anwendung selber nicht aktiv habe.

MfG
Binabic


----------



## U2nt (30. Mai 2010)

Erlich gesagt hab ich das noch nicht wirklich gebraucht, aber ich weiß auch nicht so genau wofür du das brauchst, warum willst du Tastenkombis außerhalb des Games abfangen?

Ich mein wenne ein Game machst das fullscreen is gehts ja eh überall...

Meine Lösung, wahrscheinlich ein wenig dirty wäre ein invisibles Frame auf die Screen size zu setzen und dort die jeweiligen Dinge abfangen


----------



## Binabic (30. Mai 2010)

Das war ja nicht meine Frage ob es jemand gebrauchen kann .... 
aber genauer erklären kann ich dir das wenn du das magst.

Ich will die Möglichkeit geben im Fenster Modus zu Spielen daher soll es möglich sein nebenher das spiel zu spielen so das zb ein Item craften kann oder einen Zaubertrank brauen kann ohne seine Eigendliche arbeit Groß zu unterbrechen einfach die Kombination drückemn und eine besti8mte fähigkeit wird ausgeführt dann gibt es einen colddown der fertigkeit es soll den leutet gestattet sein sich ihre emails abzurufen im browser etwas nachzuschauen oder sich im editor etwas zu notieren, oder sogar neben der Arbeit ein bissel was zu machen. Das soll ein spiel werden das man sozusagen wirklich nebenher spielen kann aber dazu muß die speil selber auch wissen wann es angesprochen wird unddas geht nunmal nur mit Tastatur und Maus abfrage ob bestimmte kombinationen betätigt wurden wenn ja wird die im Spiel festgelegte Aktion dafür durchgeführt.

Ich könnte  den leuten erklauben einen Macrotool zu nutzen aber eigendlich sollte das nicht sinn der sache sein sondern ich will die möglichkeiten  im spiel selber realisieren so das sie wirklich jeder speiler nutzen kann und somit die bedingungen für alle gleich sind.

MfG
Binabic


----------



## U2nt (30. Mai 2010)

Ich weiß nicht ob es funktioniert, aber ich würde einfach ein Frame unsichtbar immer im Vordergrund auf die Größe des Bildschirms setzen und damit den Key bzw. Mouselistener verbinden.

Naja wie gesagt, ich weiß nicht ob das funktioniert, wäre nur eine Theorie.


----------



## Binabic (30. Mai 2010)

U2nt hat gesagt.:


> Ich weiß nicht ob es funktioniert, aber ich würde einfach ein Frame unsichtbar immer im Vordergrund auf die Größe des Bildschirms setzen und damit den Key bzw. Mouselistener verbinden.
> 
> Naja wie gesagt, ich weiß nicht ob das funktioniert, wäre nur eine Theorie.



währe unlogisch da sonst die anwendungen die hinter dem Frame liegen nicht mehr angesprochen werden.

Es soll ja möglich sein sein Andere Anwednungen zu starten und zu bedienen in der zeit.

Es muß meines erachtens eine Klasse geben die mit der Java sozusagen verbindung zur Maus und zum Keyboard hat die unabhängig von der anwenung siegnaliesiert es pasiert was.

MfG
Binabic


----------



## kay73 (30. Mai 2010)

Ich bin nicht sicher, ob ich dich richtig verstehe. Willst etwas in der folgenden Art machen: Das Spiel ist in einem Fenster auf dem Desktop und hat keinen Fokus. User hat die notepad.exe offen und die hat den Fokus. User tippt darin einen Text und mitten im Tippen drückt er Alt + rechte Maustaste und es soll etwas im Spielfenster passieren?


----------



## Binabic (30. Mai 2010)

kay73 hat gesagt.:


> Ich bin nicht sicher, ob ich dich richtig verstehe. Willst etwas in der folgenden Art machen: Das Spiel ist in einem Fenster auf dem Desktop und hat keinen Fokus. User hat die notepad.exe offen und die hat den Fokus. User tippt darin einen Text und mitten im Tippen drückt er Alt + rechte Maustaste und es soll etwas im Spielfenster passieren?



Genau die Alt + rechte Maustaste soll jetzt für das Spiel das Siegnal sein ich muß jetzt etwas zuvor festgelegtes tun. Der User muß nicht jedesmal dem spiel den Fokus geben er kann weiter im Editor tippen oder andere Arbeiten verrichten.


----------



## U2nt (30. Mai 2010)

Hab einen interesannten Thread dazu gefunden, mit dem das über dem JNI läuft...



> Perhaps a bit late, but I found myself wanting of something similar to this. I made a JNI dll for C++ for Win95 or better that could capture global keystrokes by using a keyboard hook. It may not be the best way, but it's the best way I could think of, and create. If you have any improvements on my code, questions, or critques (anyone) please post it here or email it to me as I could really use the feedback.
> 
> As I don't have a website of my own, I'll post code here. Good luck
> 
> ...



Quelle:sun forums


----------



## Onkel Hatti (30. Mai 2010)

Binabic hat gesagt.:


> Genau die Alt + rechte Maustaste soll jetzt für das Spiel das Siegnal sein ich muß jetzt etwas zuvor festgelegtes tun. Der User muß nicht jedesmal dem spiel den Fokus geben er kann weiter im Editor tippen oder andere Arbeiten verrichten.



Java kann nur auf Ereignisse reagieren, wenn die Applikation den Focus hat. Alles andere spielt sich auf Betriebssystemebene ab, dass kann Java nicht. Man muss sich also über C/C++ in die Ereignisbehandlung des Betriebssystems einklinken. Das ist aber dann nicht mehr plattformunabhängig.


----------



## U2nt (30. Mai 2010)

Onkel Hatti hat gesagt.:


> Man muss sich also über C/C++ in die Ereignisbehandlung des Betriebssystems einklinken. Das ist aber dann nicht mehr plattformunabhängig.



Siehe mein Post


----------



## Binabic (30. Mai 2010)

Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z  C++ nutzen.

Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.

Onkel Hatti du wilst mir also damit sagen das alle Aktionen die gemacht werden sobald Die anwendung nicht mehr den fokus hat nicht an Java weiter geleitet werden sondern sozusagen im Betriebssystem abgearbeitet werden erst wenn eine Java anwendung den Fukus erhält reicht windows die ereignisse an Java weiter und erst dann können sie bearbeitet werden.


----------



## U2nt (30. Mai 2010)

Binabic hat gesagt.:


> Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z  C++ nutzen.
> 
> Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.



Dann geht es nicht mit Java.


----------



## Binabic (30. Mai 2010)

U2nt hat gesagt.:


> Dann geht es nicht mit Java.



Eindeutiger Minuspunkt für Java muß ich dann sagen es dürfte ja nicht so schwer sein sobald ein Javaprogramm läuft ein Globales Key- oder Mausevend auszulösen weil das ist es genau was ich nicht ganz begreife.

Es muß ja schon jetzt eine Klasse geben die von der Hardware (Maus oder Tastatur) ein signal bekommt sobald sich da was tut Java ist ja da sogar schon weiter es kann zuordnen um weches Objekt es sich handelt und Führt dann den jeweiligen code aus.

Daher verstehe ich das nicht so ganz da ich ja eigendlich nichts will was nicht schon pasiert nur das ich das sozusagen auf globaler ebene möchte. 

Na ja vileicht fidnet sich ja noch jemand der sich da Wesendlich besser auskennt als ich und mir sagen kann wie man das vielicht doch umsetzen kann.


----------



## U2nt (30. Mai 2010)

Ich meine so stands in den Posts auf der Seite von oben... Globale Keys sind "anscheinend" Systemabhängig. Aber wie du schon gesagt hast, vlt. findet sich jemand der sich damit besser auskennt.


----------



## Onkel Hatti (31. Mai 2010)

Binabic hat gesagt.:


> Danke U2nt aber genau das will ich ja nicht wenn ich etwas für die windows welt programmieren möchte kann ich dann gleich von A bis Z  C++ nutzen.
> 
> Großer vorteil von Java ist ja die plattform unabhänigkeit ich möchte mir keine gedanken darum machen welches Betriebssystem der Anwender nutzt und um dann die gängigen zu bedienen jeweils eine extra version dazu schreiben.
> 
> Onkel Hatti du wilst mir also damit sagen das alle Aktionen die gemacht werden sobald Die anwendung nicht mehr den fokus hat nicht an Java weiter geleitet werden sondern sozusagen im Betriebssystem abgearbeitet werden erst wenn eine Java anwendung den Fukus erhält reicht windows die ereignisse an Java weiter und erst dann können sie bearbeitet werden.



Jepp. Das ist aber mit jedem Programm so. Mach mal Word auf, schreib nen Text, dann gib den Focus auf den Explorer und drück Ctrl-S (unter Word: speichern), Isch schwör, in Word tut sich gar nix. Wär auch die Härte...
Darum geht die Sache anders herum: Nicht Windows gibt das weiter, sondern ein Programm holt es sich, indem es sich in die Ereignisbehandlung einklinkt, und damit jede Nachricht, die im System rumschwirrt bekommt und auswerten kann. Es ist, als würde sich das Programm in die Ereignisbehandlung "einhaken", daher wird ein solches Programm auch "hook" genannt.
1. Diese Ereignisbehandlung ist sehr plattformabhängig, es könnte sogar sein, dass es unter den div. Windowsversionen Unterschiede gibt, so dass ein Hook hier funktioniert, dort nicht.
2. Eine als plattformunabhängig konzipierte Sprache wie Java kann so was nicht.
3. Ob das ein Minuspunkt von Java ist, musst du selbst entscheiden. Es gibt sooo viele Sprachen in der Computerwelt, such' dir die aus, die das macht, was du willst.

Onkel Hatti


----------



## Binabic (4. Jun 2010)

@ Onkel Hatti 

Sobald ein Java programm aktiv ist holt es sich ja schon die notwendigen informationen vom System.

Das die Tastenkombinationen Strg + S in Word nicht funktioniert wenn du es nicht aktiv hast ist ja klar den der nebenefeckt das du Plötzlich bei 3 verscheidnene anwendungen mit Strg + S deine dateien speicherst ist ja mit absicht nicht gewollt.

Aber zum Problem Java fängt ja Maus und Tastatur eingaben auf jedoch wird das ja nur gemacht wenn ein JavaProzess Aktiv ist. Also ist eigendlich schon einiges vorhanden ich glaube garnicht das man da so einen großen akt machen muß ich denke das es durchaus möglich ist mit ein paar erweiterungen das hinzubekommen und ich werde ja nicht der einzige sein der troz aller Aussagen weiter versucht und mit ein bischen Glück wird es irgendwann jemand schaffen.

Und wenn man etwas mit einer Sprache nicht Programieren kann ist es immer ein Minuspunkt.
Es heist nicht das die Sprache schlecht ist sondern das ist vergleichbar mit den Menschen.
Es gibt keinen Menshcen der etwas Perfeckt kann jeder hat vor und nachteile und man muß mit ihnen leben oder daran Arbeiten


----------

