无模式对话框和加速器

时间:2011-08-19 14:05:09

标签: c++ windows dialog accelerator modeless

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

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

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

我考虑在WH_GETMESSAGE上使用Window挂钩,在从GetMessagePeekMessage返回之前调用它。但是我不确定在成功调用TranslateAcellerator之后会发生什么,我不能让应用程序知道我处理它。 WH_MSGFILTER会要求应用程序实现对CallMsgFilter的调用,而调试者无需快速浏览。

我的最后一个想法是继承控件,这是我想要避免的。这需要一些机制来向父窗口发出按键事件的信号,我认为这不是一个很棒的设计。另外,如果我添加更多控件,我必须将每一个控件子类化。

感谢任何提示。

2 个答案:

答案 0 :(得分:1)

这是一个相当臭名昭着的互操作问题,当使用Winforms在本机程序中实现UI时,它也会变得丑陋。微软的推荐是一个粗略的推荐:启动你自己的线程来显示窗口,这样你就可以抽出你自己的消息循环。你需要SetParent()来避免Z顺序问题。可怕的东西,在提交之前要考虑模态对话三次。

答案 1 :(得分:0)