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