【发布时间】:2011-08-24 16:11:04
【问题描述】:
我已将 Adobe Reader ActiveX 控件作为子窗口嵌入到 MFC 应用程序中,但如果 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 控件获得焦点时,它似乎从未被击中。我尝试在我的应用程序中使用键盘钩子来覆盖控件的键处理,但它似乎工作不可靠 - 它会运行一段时间,但经过一些交互后,键盘钩子完全停止。
有什么想法吗?提前致谢。
【问题讨论】:
标签: mfc activex adobe-reader