【发布时间】:2021-03-23 23:55:59
【问题描述】:
我设置了一个处理程序来在短时间内捕捉击键,同时为窗口使用私人消息循环。虽然它有效,但如果我尝试PostThreadMessage,窗口永远不会收到消息?
回调看起来像(我尝试了其他消息,这个示例带有私人消息):
LRESULT CALLBACK LLKeyboardHookProc(int ncode, WPARAM wp, LPARAM lp)
{
if (ncode == HC_ACTION) {
if (wp==WM_KEYDOWN) {
KBDLLHOOKSTRUCT *kbs=reinterpret_cast<KBDLLHOOKSTRUCT*>(lp);
if (kbs->vkCode==VK_ESCAPE) {
PostThreadMessage (GetCurrentThreadId(), UWM_MYCLOSEMESSAGE, 0, 0);
}
}
}
return CallNextHookEx(0, ncode, wp, lp);
}
HHOOK kbhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookProc, GetModuleHandle(NULL), 0);
WS_EX_LAYERED 窗口的消息循环如下所示:
while (IsWindow(hwnd)) {
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
// let MFC do its idle processing
LONG lIdle=0;
while (AfxGetApp()->OnIdle(lIdle++));
WaitMessage();
}
// clean up
UnhookWindowsHookEx(kbhook);
我现在将其更改为使用 volatile 变量来关闭窗口,但我真的很想给它发送一条消息。如果没有锁,使用全局 HWND 不会是线程安全的,所以不想那样做。
附:我确实检查了 PostThreadMessage 结果,它不是 FALSE(我添加它们时没有调试消息),所以它似乎将它发布在某个地方。
【问题讨论】:
-
当你还创建了一个窗口时,千万不要使用 PostThreadMessage(),像调整窗口大小这样简单的事情会导致消息丢失。但是,很明显,您在消息循环中没有任何代码来处理消息。 DispatchMessage() 什么都不做,没有窗口。不要使用它。