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



我试图在我的Java代码中接收WM_HOTKEY事件。我已经成功地让一些一次性代码工作,但我意识到,将Java GUI代码与Windows消息循环集成需要谨慎。

似乎从Windows的例子中,User32.INSTANCE。GetMessage是用于通知WM_HOTKEY事件的关键函数,我已经使用User32.INSTANCE.RegisterHotKey

所以…我想知道:

  • 我是否正确地理解了RegisterHotKey和我的消息循环必须在同一个Java线程上运行?
  • 我是否正确理解了Windows的GetMessage函数必须从我用来创建Windows的同一线程调用,这是Java Swing的事件调度线程?
  • 如果是这样,我不能在事件调度线程上创建消息循环,因为它会阻塞其他事件。我应该用PeekMessage代替吗?
  • 如果是这样,我会有轮询代码,这不是我最喜欢的。我应该多久打一次PeekMessage?PeekMessage轻便快捷吗?

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

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

是的。RegisterHotKey()文档中提到了这一点:

此函数不能将热键与另一个线程创建的窗口关联


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

是的。一个窗口由创建它的线程拥有,并且只有拥有它的线程可以接收该窗口的消息。


如果是这样,我就不能在事件调度线程上创建消息循环,因为它会阻塞其他事件。我应该用PeekMessage代替吗?

你可以,是的。


如果是这样,我将有轮询代码,这不是我最喜欢的。我应该多久打一次PeekMessage?PeekMessage轻便快捷吗?

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

最新更新