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:
Bei Ereignissen wie dem Schlüssel Windows
oder Alt+Tab
wird das Fenster jedoch deaktiviert:
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
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 )
Ich habe diesen Code nicht testen können, aber ich hoffe, dass zumindest die Idee dich in die richtige Richtung bringt.
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 .
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.
Sie können WindowListener.Hope verwenden, um das Ereignis zu erfassen. Es gibt auch windowfocuslistener, windowstatelistener.
%Vor%Tags und Links java swing events event-handling