在Internet Explorer中运行的MFC ActiveX中托管的wpf窗口中的击键

时间:2010-04-06 13:49:26

标签: wpf internet-explorer mfc activex

我们在Visual Studio 2008中创建了一个带有CLR支持的MFC ActiveX控件,它创建了一个WPF网格并在该网格中显示了一个WPF窗口。

此ActiveX托管在Internet Explorer中,它显示并且工作正常,但tab键,退格键,功能键等不起作用,因为它们由IE而不是WPF窗口处理。常规字符很好用。这是一个已知的功能,之前当我们在此ActiveX中使用基于MFC的对话框时,我们使用了这个:http://support.microsoft.com/kb/187988。通过直接使用此代码

AfxGetApp()->PreTranslateMessage((LPMSG)lParam) 

语句将返回FALSE,因此我无法获得WPF窗口处理的键击。我相信我需要问WPF应用程序而不是CWinApp,但我不确定如何以及是否可以这样做。有没有人对这里发生的事情有足够的了解才能让它发挥作用?

使用XBAP而不是ActiveX不是一个选项,因为它在Intranet应用程序中运行,该应用程序需要比沙箱可以提供的更多访问权限。

我希望这是足够的信息。

最诚挚的问候

Svein Dybvik

2 个答案:

答案 0 :(得分:2)

我们在MFC无模式对话框中托管了一个WPF用户控件。为了让一些键盘工作正常,我们不得不修改对话框PreTranslateMessage()函数。

基本上,我们所做的是检查消息是否是针对WPF窗口的。如果是,我们立即调用TranslateMessage / DispatchMessage,然后从PreTranslateMessage返回TRUE。

我们的WPF控件填充整个对话框,因此您必须在我们进行IsChild测试的地方进行自己的条件检查。

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg)
{
   // normal PreTranslateMessage() causes the edit fields not to work
   if (::IsChild(GetSafeHwnd(), pMsg->hwnd))
   {
      TranslateMessage(pMsg);
      DispatchMessage(pMsg);

      return TRUE;
   }

   return baseclass::PreTranslateMessage(pMsg);
}

答案 1 :(得分:0)

一些编辑:

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg)
    {
       // normal PreTranslateMessage() causes the edit fields not to work
       if (::IsChild(GetSafeHwnd(), pMsg->hwnd))
       {
          TranslateMessage(pMsg);
          DispatchMessage(pMsg);
          pMsg->hwnd = GetSafeHwnd(); // redirect to parent
       }
       return baseclass::PreTranslateMessage(pMsg);
    }