使用JNA在Java代码中使用GetMessage或PeekMessage的安全方法是什么?

时间:2014-07-10 17:59:51

标签: java swing winapi event-handling jna

我试图在我的Java代码中接收WM_HOTKEY事件。我已经成功地获得了一些丢失的代码,但我知道将Java GUI代码与Windows消息循环集成时需要谨慎。

似乎从Windows示例中,User32.INSTANCE.GetMessage是用于通知我使用User32.INSTANCE注册的WM_HOTKEY事件的关键功能。注册用户名。

所以...我想知道:

  • 我是否正确理解RegisterHotKey和我的消息循环必须在同一Java线程上运行?
  • 我是否正确理解Windows'必须从我用来创建Windows的同一个线程调用GetMessage函数,这是Java Swing的事件调度线程吗?
  • 如果是这样,我就无法在Event Dispatch Thread上创建一个消息循环,因为它会阻止其他事件。我应该使用PeekMessage吗?
  • 如果是这样,我会有轮询代码,这不是我的最爱。我应该多久调用一次PeekMessage? PeekMessage是否轻巧快速?

非常感谢帮助Java程序员了解Win API概念。

1 个答案:

答案 0 :(得分:2)

  

我是否正确理解RegisterHotKey和我的消息循环必须在同一Java线程上运行?

是。 RegisterHotKey() documentation中提到了这一点:

  

此功能无法将热键与另一个线程创建的窗口相关联


  

我是否正确理解Windows的GetMessage函数必须从我用来创建Windows的同一个线程调用,这是Java Swing的事件调度线程?

是。窗口由创建它的线程拥有,只有拥有线程才能接收窗口的消息。


  

如果是这样,我无法在Event Dispatch Thread上创建消息循环,因为它会阻止其他事件。我应该使用PeekMessage吗?

你可以,是的。


  

如果是这样,我会有轮询代码,这不是我的最爱。我应该多久调用一次PeekMessage? PeekMessage是否轻巧快速?

我建议创建一个专用线程来创建自己的窗口并使用GetMessage()作为其消息循环。