【问题标题】:Creating Two Windows Causes Second Created to Bum Out创建两个窗口会导致第二个创建失败
【发布时间】: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


【解决方案1】:

问题是两个窗口都有相同的类名。这确实让我有点困惑,因为我认为他们被允许这样做,然后我将在我的包装器中添加一个静态实例计数成员。最终的结果是,这方面的所有问题现在都已修复:D
编辑:我只是在学习后才添加它,但我了解到您可以创建两个具有相同类名的窗口,但它们必须使用相同的窗口过程。学习这一点实际上增强了我对这个主题的理解,所以如果我为其他人澄清这一点,我会很高兴。 /编辑

以防万一您想知道这样做的目的是什么,我将其中的一小部分包括在内。它有望变成您可以“剥皮”屏幕的东西。它确实保持在顶部并现在跟随你,所以大部分都完成了。正如你所看到的,不是最好的电脑使用

稍后当我添加退出方式时,控制台窗口将被隐藏。

【讨论】:

  • 是解决方案的“进展如何”笑脸部分,如果不是,我会发布没有它的屏幕截图。这会分散注意力且没有必要。
  • 只是人们通常会想知道你到底想通过这个来完成什么,一旦主要部分实际工作,截图是展示它的最佳方式。它不必如此直接,装饰性边框是一种用途。笑脸是该程序的产品,当您切换窗口等时,它会保持在最前面,这就是我的观点,因为这就是我在解决这个问题时能够实现的。将来,我会记得对我自己的问题做出更多信息的回答,我只是在我原来的帖子中找到了它。
  • 啊,好吧……经过深思熟虑后,它看起来像是手绘的 MS Paint :)
  • 是的,在这个阶段都是徒手画的,但是当我有时间时,我计划添加一个漂亮的浮动工具栏等,以及一个带有易于布局选项的窗口。
猜你喜欢
  • 2018-06-26
  • 2020-11-25
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2021-03-17
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多