我们有一个MFC对话框与微软Web浏览器activex控件显示网页。当页面包含silverlight时,您无法在silverlight文本框中键入内容。似乎鼠标和命令消息使它成为silverlight,而不是wm_keydow/wm_keyup
指向microsoft connect问题https://connect.microsoft.com/VisualStudio/feedback/details/536872/silverlight-3-cannot-type-in-textbox-when-running-in-microsoft-web-browser-object
解决方案1 -将Silverlight应用程序的html对象更改为"windowless":
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="webConnectSilverlightApplication.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<param name="windowless" value="true"/>
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
解决方案2 -在WebViewer对话框类中覆盖PreTranslateMessage来覆盖错误:
BOOL CMFC_WebViewerDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_CHAR)
{
DispatchMessage(pMsg);
return true;
}
return CDialog::PreTranslateMessage(pMsg);
}
可能的原因
问题是ActiveX控件不拥有信息泵。的消息泵归容器所有应用程序。因此,所有的键击消息由容器应用和非容器应用分派到非模态对话框或者属性表窗口。
问题不会发生在模态对话框/属性表窗口因为消息泵属于对话框管理器,它需要注意处理所有按键消息。引用源http://support.microsoft.com/kb/187988