c++ - 无模式对话框和加速器

标签 c++ windows dialog accelerator modeless

当用户在无模式对话框中按下 CTRL+S 时,我想执行一些操作。 加速器将是完美的选择,除了我无法控制线程的消息循环(想想插件),所以我不能调用 TranslateAccelerator

嵌套的消息循环不是一个选项,因为主应用程序在调用 PeekMessage 之间执行大量处理。

  • 有什么方法可以“强制”现有的消息循环来处理我的加速器吗?
  • 除了加速器还有其他方法可以捕捉CTRL+S吗?

我考虑过在 WH_GETMESSAGE 上使用 Window Hook ,它在从 GetMessagePeekMessage 返回之前被调用。但是我不确定在我成功调用 TranslateAcellerator 之后会发生什么,我不能让应用程序知道我处理了它。 WH_MSGFILTER 将要求应用程序实现对 CallMsgFilter 的调用,但使用调试器快速浏览时不会出现这种情况。

我最后的想法是将控件子类化,这是我要避免的。这将需要某种机制将按键事件发送到父窗口,我认为这不是一个很好的设计。此外,如果我添加更多控件,我将不得不对每个控件进行子类化。

感谢任何提示。

最佳答案

这是一个相当臭名昭著的互操作问题,它在使用 Winforms 在 native 程序中实现 UI 时也会出现。微软的建议是一个粗略的建议:启动你自己的线程来显示窗口,这样你就可以启动你自己的消息循环。您需要 SetParent() 来避免 Z 顺序问题。可怕的事情,在提交之前请考虑三次模态对话框。

关于c++ - 无模式对话框和加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122756/

相关文章:

c++ - 检查 C++ 中是否存在 bmp 文件

windows - 在 Go 中将窗口刻度转换为 UNIX 时间戳

c++ - 如何在单独的线程中创建带有进度条的 MFC 对话框?

c# - 未在任务栏中显示的 WPF ToolWindow 阻止应用程序

c++ - 父类(super class) operator() 错误 - 不明确

C++ 模板,vector.size 用于默认参数定义

C++ -- Win32 API、GUI 的东西

c++ - 转换标准 :vector<reference_wrapper<Base>> to std:vector<reference_wrapper<Derived>> Runtime error time: 0 memory: 3412 signal:6

java - 我在 java 中的 endTime 有问题

javascript - 如何在 jquery 中正确编写一个 "Are you sure you want to delete/create/etc?"对话框