【发布时间】:2011-11-29 02:28:36
【问题描述】:
我正在尝试使用热键将分层窗口从透明更改为允许鼠标消息通过。
在我的主要功能中,我调用
// make hotkey with WM_HOTKEY messages sent to hwnd's window procedure, id 1,
// no other keys to work, F5 as hotkey
// while checking for errors and it completes successfully. I also do the same
// (id of 2) for VK_F7 and it completes successfully.
RegisterHotKey (hwnd, 1, 0, VK_F5);
RegisterHotKey (hwnd, 2, 0, VK_F7);
在我的窗口过程中,我有
case WM_HOTKEY:
MessageBox (hwnd, "Got here", "Attention", MB_OK);
// Other stuff I need to do here
我尝试添加MOD_CONTROL,但无济于事。
这在以前确实有效。现在唯一的区别是我意识到两个窗口可以解决我一直遇到的问题。上次我只有一个,现在我的应用程序中有两个窗口程序。我确保一切都正确无误,但我不应该仅限于 1 个窗口......窗口本身会显示,因为我将透明度设置为 100/255,因此它会稍微屏蔽视图,并且我可以看到那个屏幕。
更改密钥本身没有任何作用,WM_HOTKEY 消息被发送到队列中。我将尝试手动将它们发送到窗口。
编辑:带有 SendMessage() 的 ^ 不起作用,将查看它是否收到 任何 消息,并且在我在它时与另一个窗口相同。
编辑:好吧,我觉得这样说是个白痴,但我让RegisterHotKey 进入了一个空 hwnd,因为我实际上还没有创建那个窗口(我创建了一个没有首先收到热键消息的窗口,最初有这些在那之后)。 问题是即使我可以看到这个窗口,如果我把它全部注释掉,视图就会不同(没有屏幕),它没有收到任何消息。
编辑:我将标题更改为更适合此额外信息的名称。如果这是任何人都经历过的通用事情,我会很高兴听到。现在,我假设它是我的包装器并手动创建它们。
主要编辑:我刚刚尝试使用原始 API 而不是我的包装器,但它在注册第二个时出错。我更改了类名,现在类注册并创建了窗口。热键出现的消息框也会显示。我想我忘了为他们放置显示窗口,我会在一秒钟内说出它是如何工作的(编辑:在我再次重新启动计算机后!!!)。在你问之前,我还没有在包装器上花太长时间,是的,它有错误检查,但使用类似的系统来设置/获取 lasterror() 并且我没有检查它们的返回值,因为第二似乎是以前创建的。
【问题讨论】:
-
您是否在同一个线程上创建了两个窗口?您是否在消息循环中检查了 WM_HOTKEY?
-
我基本上设置了一个窗口,创建它,然后设置另一个窗口,然后立即创建它。如果您的意思是 main() 中的消息循环,我不应该这样做,因为我指定了关联的窗口。不过,我将确保它们首先被发布为接下来的事情。编辑:是的,他们正在发送,我通过 if (msg.message == WM_HOTKEY) MessageBox(...);
-
如果它们到达您的消息循环,那么您的窗口进程不是您认为的那样,或者您传递错误。你的消息循环是什么样的?
-
好的,我切换了设置/创建窗口的顺序,现在它正在接收消息。在这一点上,我觉得我应该提到我正在使用我自己的包装类的两个实例来设置/创建(而不是处理)这些窗口。我会调查一下,看看在制作多个实例时是否有问题,尽管我不知道它会如何。 @你的问题:
while (GetMessage (&msg,0,0,0) > 0) { //checking for WM_HOTKEY was here; TranslateMessage (&msg); DispatchMessage (&msg); }这是放在 main 的末尾。 -
如果你自己解决了,你可以回答你自己的问题并接受你自己的答案。
标签: c++ winapi message hotkeys