当用户在无模式对话框中按下 CTRL+S
时,我想执行一些操作。
加速器将是完美的选择,除了我无法控制线程的消息循环(想想插件),所以我不能调用 TranslateAccelerator
。
嵌套的消息循环不是一个选项,因为主应用程序在调用 PeekMessage
之间执行大量处理。
- 有什么方法可以“强制”现有的消息循环来处理我的加速器吗?
- 除了加速器还有其他方法可以捕捉
CTRL+S
吗?
我考虑过在 WH_GETMESSAGE
上使用 Window Hook ,它在从 GetMessage
或 PeekMessage
返回之前被调用。但是我不确定在我成功调用 TranslateAcellerator
之后会发生什么,我不能让应用程序知道我处理了它。
WH_MSGFILTER
将要求应用程序实现对 CallMsgFilter
的调用,但使用调试器快速浏览时不会出现这种情况。
我最后的想法是将控件子类化,这是我要避免的。这将需要某种机制将按键事件发送到父窗口,我认为这不是一个很好的设计。此外,如果我添加更多控件,我将不得不对每个控件进行子类化。
感谢任何提示。
最佳答案
这是一个相当臭名昭著的互操作问题,它在使用 Winforms 在 native 程序中实现 UI 时也会出现。微软的建议是一个粗略的建议:启动你自己的线程来显示窗口,这样你就可以启动你自己的消息循环。您需要 SetParent() 来避免 Z 顺序问题。可怕的事情,在提交之前请考虑三次模态对话框。
关于c++ - 无模式对话框和加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122756/