我正在使用IWebBrowser2接口在父应用程序中加载嵌入式浏览器。我的代码被编译成一个dll,即浏览器组件通过插件接口在运行时动态加载。
我遇到的问题是,加载我的dll的应用程序正在捕获某些按键消息,因此它们没有到达我的IWebBrowser2实例。
因此,我使用dll中的SetWindowsHookEx() API捕获这些消息。
然后如何将WM_KEYDOWN或WM_CHAR消息转发给我的IWebBrowser2实例,以便它们可以被用于在浏览器中的焦点文本框中输入文本?
发布于 2017-01-31 19:38:30
听起来根本问题是,您的窗口与宿主应用程序的窗口处于不同的线程上,这可能会混淆焦点状态。您可以很容易地进入这样的情况:主机窗口和托管窗口都认为它们具有焦点。
解决方案是在与父窗口相同的线程上创建窗口,如果这是不可能的(例如,由于插件模型或插件在单独的进程中运行),则使用AttachThreadInput。
我已经很多年没有使用web浏览器控件了,但我还记得很久以前的一个项目,当我们将web浏览器控件添加为另一个进程中窗口的子控件时,我们遇到了类似的问题。使用AttachThreadInput解决了很多错误。缺点是任一个线程中的一个bug (比如挂起)有效地挂起两个线程。在拆卸过程中,我们还必须小心地分离线程。
发布于 2017-01-31 08:38:04
看起来,这比通常发出的信息要复杂得多:
首先,您需要获得位置活动对象( web浏览器的https://msdn.microsoft.com/en-us/library/windows/desktop/ms691299(v=vs.85).aspx),然后调用TranslateAccelerator (https://msdn.microsoft.com/en-us/library/windows/desktop/ms693360(v=vs.85).aspx )。
一些非常高级别的伪码如下所示:
HRESULT hr;
IOleInPlaceActiveObject* pIOIPAO;
hr = webBrowser2->QueryInterface(webBrowser2,
&IID_IOleInPlaceActiveObject, (LPVOID*)&pIOIPAO);
if (SUCCEEDED(hr))
{
result = pIOIPAO->lpVtbl->TranslateAccelerator(pIOIPAO, msg);
}在msg是消息(MSG)的地方,您应该相应地填充,而webBrowser2是您的IWebBrowser2。
PS:没有尝试这段代码,使用时自己承担风险:)
https://stackoverflow.com/questions/41911104
复制相似问题