我在 MFC 应用程序中嵌入了一个 Adobe Reader ActiveX 控件作为子窗口,但是如果 Reader 具有焦点,则不会触发我的 MFC 应用程序中定义的任何加速器,无论它们是否被 Adobe Reader 使用。如果我使用相同的方法嵌入其他 ActiveX 控件,我可以毫无问题地检测到我的加速器。
我使用 Visual Studio 2008 IDE 为 Adobe Reader ActiveX 控件(默认称为 CAcroAXDocShim)生成包装器。在 WM_INITDIALOG 处理期间用于创建控件的代码是:
m_ctrl.Create(_T("PDF Viewer"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP, CRect(5, 5, 400, 300), this, 1001);
m_ctrl.LoadFile(_T("C:\\auslab\\test.pdf"));
出现该窗口,正确加载 PDF,并且工作正常,但是如果 ActiveX 控件具有焦点,我无法拦截键盘输入,方法是:
- 使用加速器
- CWinApp 派生类上的 PreTranslateMessage
- ActiveX 控件的父窗口的窗口类上的 PreTranslateMessage
- 处理 WM_SYSCOMMAND
事实上,我试图在主窗口消息循环中的键的 WM_KEYDOWN 消息上设置断点,当 ActiveX 控件获得焦点时,它似乎从未被击中。我曾尝试在我的应用程序中使用键盘钩子来覆盖控件的键处理,但它似乎工作不可靠 - 它会运行一段时间,但经过一些交互后,键盘钩子会完全停止。
有任何想法吗?提前致谢。