【问题标题】:Pressing Alt hangs the application按 Alt 会挂起应用程序
【发布时间】:2012-07-22 07:29:01
【问题描述】:

我正在编写一个没有菜单的 Windows 应用程序。每次我按下 Alt 时,它都会收到 WM_ENTERMENULOOP 事件并挂起,直到我按下一个键。
我尝试过其他没有菜单的应用程序(例如 MS .chm 文件查看器),它们表现出相同的行为。
将事件转发到 DefWindowProc 或处理它没有区别。

如果没有菜单,有没有办法阻止 Windows 进入菜单循环?或者,有没有办法在收到事件后立即手动退出?

【问题讨论】:

  • 您有一个菜单:系统菜单 (WS_SYSMENU)。并且应用程序不会挂起。菜单循环正在发送消息。
  • 这样就进入了系统菜单的菜单循环而不显示?这非常有用。猜猜我将不得不在没有图标的情况下生活。谢谢。
  • 如果您在 Alt 后加空格,系统菜单将显示。这种“等待”状态就是为什么消息框有时会卡在不可见状态,直到您再次点击 alt 键。

标签: winapi


【解决方案1】:

如果您想禁用进入菜单循环,请手动处理 WM_SYSKEYDOWNWM_SYSKEYUP(不要将它们传递给 DefWindowProc)。

此外,您可能需要处理 WM_SYSCHAR 并返回 TRUE 以获取此消息,以避免像 Alt+SomeKey

这样的按键发出哔声

【讨论】:

  • 请不要阻止 Alt+空格。当应用程序禁用标准 Windows 功能时,它让我无所适从(我敢肯定其他人)!
  • 我没有阻止它。我使用 WM_SYS*​​ 消息使其工作,而无需在 Alt 和以下击键之间“挂起”所有内容。
  • 要添加,进入菜单循环会导致WM_ENTERIDLE 消息不断发送到WindowProc。不调用 DefWindowProc 可以修复此挂起,但是,它会阻止正常操作(例如 Alt+F4 不再关闭应用程序)。
  • 这里有一个更好的处理方法:stackoverflow.com/questions/11870103/…
【解决方案2】:

解析窗口消息并返回正确结果后的可扩展代码,不调用 DefWindowProc。

case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_SYSCHAR:
    return (LRESULT)1;

https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-syskeydown

https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-syskeyup

https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syschar

返回值

如果应用程序处理此消息,它应该返回零。

【讨论】:

  • 这可能是一个很好的答案 Redee!你能提供一些文字来帮助他们理解你在这里给出的逻辑吗?
猜你喜欢
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多