在不停用窗口的情况下捕获JFrame中的所有事件

tin*_*ast 9 java events swing event-handling

我正在尝试开发类似远程桌面/ VNC客户端的东西.我有必要捕获客户端窗口中的所有事件.我正在使用的processEvent方法是覆盖以下方法JFrame:

@Override
protected void processEvent(AWTEvent e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,在Windows键或Alt+Tab窗口等事件被取消激活时:

...    
00000191 KEY_PRESSED,keyCode=524,keyText=Windows,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=91,primaryLevelUnicode=0,scancode=91,extendedKeyCode=0x20c 
00000192 KEY_RELEASED,keyCode=524,keyText=Windows,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=91,primaryLevelUnicode=0,scancode=91,extendedKeyCode=0x20c 
000000ce WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0 
...
Run Code Online (Sandbox Code Playgroud)

如何让窗口保持活动状态?

更喜欢纯Java解决方案.如果没有纯Java解决方案,有人可以指向我的JNA解决方案(或任何其他解决方案)?

EDIT1: *解决了窗口停用的模糊术语"焦点"*强调非纯Java解决方案是可以接受的

Til*_*ilo 1

1.) JNA 附带了一个几乎可以满足您需求的示例:

http://java.net/projects/jna/sources/svn/content/trunk/jnalib/contrib/w32keyhook/KeyHook.java

为了阻止某个键,只需返回 1 而不是调用CallNextHookEx- cf。MSDN文档

2.) JNativeHook允许您挂钩全局事件处理,但目前无法阻止事件的传递 - 例如 Windows 键仍会激活开始菜单。然而,它仍然值得一看,因为它的开销要少得多,并且您可以修改它(从CallNextHookEx 此处开始)以按照您想要的方式运行。不过它是根据 GPL 获得许可的。

3.) 另一种简洁的方法是切换到 SWT 并使用SWT Win32 扩展来拦截键盘事件。