Erfassen Sie alle Ereignisse in JFrame, ohne das Fenster zu deaktivieren

9

Ich versuche, so etwas wie einen Remote-Desktop / VNC-Client zu entwickeln. Ich muss alle Ereignisse im Client-Fenster erfassen. Die Methode, die ich verwende, besteht darin, die Methode processEvent von JFrame zu überschreiben:

%Vor%

Bei Ereignissen wie dem Schlüssel Windows oder Alt+Tab wird das Fenster jedoch deaktiviert:

%Vor%

Wie behalte ich das Fenster bei solchen Ereignissen aktiv?

Ich würde eine reine Java-Lösung dafür bevorzugen. Wenn es keine reine Java-Lösung gibt, kann mich jemand auf eine JNA-Lösung (oder eine andere Lösung für diese Tatsache) hinweisen?

EDIT1: * Behobener mehrdeutiger Begriff "Fokus" auf Deaktivierung des Fensters * Betont, dass nicht pure Java-Lösungen akzeptabel sind

    
tinkerbeast 12.12.2012, 08:53
quelle

4 Antworten

1

Können Sie das Fenster nicht so einstellen, dass es ständig fokussierbar ist ( Window.setFocusableWindowState ), weil JFrame diese Methode von Window erbt. Etwas einfaches wie: window.setFocusableWindowsState(true) . Und innerhalb eines Key-Event-Listeners rufen Sie dies auf: (Dieser Code wurde geändert, aber ursprünglich aus Nicht reagierender KeyListener für JFrame )

%Vor%

Ich habe diesen Code nicht testen können, aber ich hoffe, dass zumindest die Idee dich in die richtige Richtung bringt.

    
acostache 20.12.2012 16:36
quelle
1

1.) JNA kommt mit einem Beispiel, das fast das was du willst:

Ссылка

Um einen Schlüssel zu sperren, geben Sie einfach 1 zurück, anstatt CallNextHookEx - cf aufzurufen. Der MSDN-Dokument .

2.) JNativeHook ermöglicht es Ihnen, sich in die globale Ereignisverarbeitung einzuklinken, aber momentan gibt es keine Möglichkeit zum Anhalten Ereignisse aus der Lieferung - z Die Windows-Taste aktiviert weiterhin das Startmenü. Es lohnt sich jedoch, es anzuschauen, da es mit weniger Aufwand verbunden ist, und Sie können es ändern (beginnend mit CallNextHookEx hier ), um sich so zu verhalten, wie Sie es möchten. Es ist jedoch lizenziert unter der GPL.

3.) Ein weiterer sauberer Weg wäre, zu SWT zu wechseln und die SWT Win32-Erweiterungen zu verwenden, um Tastaturereignisse abzufangen .

    
Tilo 21.12.2012 20:57
quelle
0

Sie können einen benutzerdefinierten FocusManager festlegen und die dispatchEvent-Methode überschreiben oder Toolkit.getDefaultToolkit () verwenden. addAWTEventListener (..). Allerdings werden dadurch keine vom Betriebssystem erfassten keyEvents abgefangen, aber Sie erhalten immer noch Ereignisse wie Repaint, wenn Sie sich beim Toolkit registrieren.

    
R.Moeller 15.12.2012 23:31
quelle
0

Sie können WindowListener.Hope verwenden, um das Ereignis zu erfassen. Es gibt auch windowfocuslistener, windowstatelistener.

%Vor%     
abishkar bhattarai 21.12.2012 11:38
quelle

Tags und Links