我试图在我的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()作为它的消息循环。