我们在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
最佳答案
我们已经在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);
}