首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将WM_KEYDOWN消息传递给IWebBrowser2实例?

如何将WM_KEYDOWN消息传递给IWebBrowser2实例?
EN

Stack Overflow用户
提问于 2017-01-28 14:48:50
回答 2查看 927关注 0票数 2

我正在使用IWebBrowser2接口在父应用程序中加载嵌入式浏览器。我的代码被编译成一个dll,即浏览器组件通过插件接口在运行时动态加载。

我遇到的问题是,加载我的dll的应用程序正在捕获某些按键消息,因此它们没有到达我的IWebBrowser2实例。

因此,我使用dll中的SetWindowsHookEx() API捕获这些消息。

然后如何将WM_KEYDOWNWM_CHAR消息转发给我的IWebBrowser2实例,以便它们可以被用于在浏览器中的焦点文本框中输入文本?

EN

回答 2

Stack Overflow用户

发布于 2017-01-31 19:38:30

听起来根本问题是,您的窗口与宿主应用程序的窗口处于不同的线程上,这可能会混淆焦点状态。您可以很容易地进入这样的情况:主机窗口和托管窗口都认为它们具有焦点。

解决方案是在与父窗口相同的线程上创建窗口,如果这是不可能的(例如,由于插件模型或插件在单独的进程中运行),则使用AttachThreadInput

我已经很多年没有使用web浏览器控件了,但我还记得很久以前的一个项目,当我们将web浏览器控件添加为另一个进程中窗口的子控件时,我们遇到了类似的问题。使用AttachThreadInput解决了很多错误。缺点是任一个线程中的一个bug (比如挂起)有效地挂起两个线程。在拆卸过程中,我们还必须小心地分离线程。

票数 1
EN

Stack Overflow用户

发布于 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 )。

一些非常高级别的伪码如下所示:

代码语言:javascript
复制
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:没有尝试这段代码,使用时自己承担风险:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41911104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档