【问题标题】:Processing windows messages in Internet Explorer_Server (IE9)在 Internet Explorer_Server (IE9) 中处理 windows 消息
【发布时间】:2012-08-01 07:37:39
【问题描述】:

我正在使用 Firebreath 开发一个无窗口插件,我想捕获一条特定消息以进行进一步处理,我可以这样做,但我认为其余消息“丢失”了。

我有这个代码来挂钩消息循环:

bool myPlugin::onWindowAttached(FB::AttachedEvent *evt, FB::PluginWindow* pluginwin)
{
    FB::PluginWindowlessWin* win = dynamic_cast<FB::PluginWindowlessWin*>(pluginwin);

    FBLOG_INFO("", win->getHWND()); //getHWND returns the HWND of the Internet Explorer_Server window (get by using Spy++)

    SubclassWindow(win->getHWND(), (WNDPROC)&myPlugin::WndProc);
    return true;
}

这是处理函数:

LRESULT CALLBACK myPlugin::WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) {
        case (WM_ERASEBKGND):           
            return 1;     
    }   
    return DefWindowProc(hWindow, msg, wParam, lParam);
}

这在 IE9 上按预期工作(我这样做是因为我在重新绘制图像时遇到了一些问题),但是点击消息和任何其他消息都没有得到处理;所以如果一个按钮与我的插件出现在同一页面中,它将无法点击。

我将 IE9 作为单个进程运行。

感谢任何帮助。

谢谢!

【问题讨论】:

  • 使用 SetWindowLongPtrCallWindowProc 解决了问题,但 IE 重新绘制自身的方式仍然存在问题。

标签: c++ internet-explorer wndproc firebreath


【解决方案1】:

你没有调用以前的 HWND 的 wndproc。普遍调用 DefWindowProc() 是不正确的。当您将 HWND 子类化时,您需要获取旧 wndproc 的地址并将您不处理的消息传递给它,而不是 DefWindowProc()。

我不知道该怎么做那个 firebreath / ATL。

【讨论】:

  • 感谢您的解释,我已经用谷歌搜索并想出了一个答案(来自 MSDN);但不知道为什么另一种方式不起作用。由于解释,我会将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多