我在
NOTIFYICONDATA
消息的第一个实例上定义了 nid
结构 WM_CREATE
。 nid
消息 ID 为 WM_TRAYICON
。我在 WM_TRAYICON
中处理 WindowProc
消息,该消息与 nid
的 hWnd
相关联。当 WM_TRAYICON
被处理时,我调用 MessageBox
。正如我现在所看到的,这看起来像是一个阻塞过程。我无法处理任何通过 WM_HOTKEY
注册的 RegisterHotKey
消息,所有这些消息都已 NULL
传递给其 hWnd
参数。该模式阻止我与 hWnd
引用的窗口进行交互,这是正常的。但是,WM_TRAYICON
消息仍在处理。每次单击托盘图标时,都会调用 MessageBox
,并出现一个新的模式。我想知道是否有人可以解释这里发生了什么。托盘图标和包含的状态区域是否在与程序其余部分不同的线程上运行?我对线程的理解很基础,所以我可能没有正确使用这个词。
我已经包含了一个指向要点的链接,其中包含运行该程序所需的所有代码。
HandleTrayIconMessage
就是问题所在。我使用 Visual Studio 2022 中的 Windows 桌面应用程序模板设置了该项目。
根本原因与您的上一个问题相同 - 您没有在窗口中注册热键。
因此,
WM_HOTKEY
将作为线程消息而不是窗口消息到达您的应用程序。您的主消息循环将需要处理该消息,您的窗口将不会收到它。
但是,
MessageBox()
将阻塞您的消息循环并运行其自己的辅助消息循环,因此它将接收WM_HOTKEY
并丢弃它,因为它无处可去。
如果您在窗口中注册了热键,那么
MessageBox()
的消息循环将能够将其分派到您的窗口过程,就像您自己的消息循环一样。