1

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

嵌套消息循环不是一个选项,因为主应用程序在调用PeekMessage.

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

我考虑过使用 Window hooks on WH_GETMESSAGE,它在从GetMessageor返回之前被调用PeekMessage。但是我不确定我成功调用后会发生什么TranslateAcellerator,我不能让应用程序知道我处理了它。 WH_MSGFILTER将需要应用程序实现对 的调用CallMsgFilter,而使用调试器一目了然。

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

感谢您的任何提示。

4

2 回答 2

1

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

于 2011-08-19T15:08:29.417 回答
0

你可以使用 WM_GETDLGCODE 吗?http://msdn.microsoft.com/en-us/library/ms645425(v=vs.85).aspx

于 2011-08-19T14:19:24.543 回答