【问题标题】:What's a safe way to use GetMessage or PeekMessage in Java code using JNA?使用 JNA 在 Java 代码中使用 GetMessage 或 PeekMessage 的安全方法是什么?
【发布时间】:2014-07-10 17:59:51
【问题描述】:

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

从 Windows 示例看来,User32.INSTANCE.GetMessage 是通知我已注册使用 User32.INSTANCE.RegisterHotKey 的 WM_HOTKEY 事件的关键函数

所以...我想知道:

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

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

【问题讨论】:

    标签: java swing winapi event-handling jna


    【解决方案1】:

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

    是的。这在RegisterHotKey()documentation中有提到:

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


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

    是的。一个窗口归创建它的线程所有,只有拥有的线程才能接收该窗口的消息。


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

    你可以,是的。


    如果是这样,我会有轮询代码,这不是我最喜欢的。我应该多久调用一次 PeekMessage? PeekMessage 轻而快吗?

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

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2020-04-08
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多