2012-07-31 76 views
0

我正在开发使用Firebreath一个没有窗户的插件,我要赶作进一步处理特定的消息,我能够做到这一点,但这样的消息的其余“丢失“ 我认为。互联网Explorer_Server(IE9)处理窗口消息

我有这样的代码挂钩的消息循环:

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作为一个进程运行。

任何帮助表示赞赏。

谢谢!

+0

使用'SetWindowLongPtr'和'CallWindowProc'解决了这个问题,但仍然有IE浏览器,重新绘制本身的方式解决问题。 – 2012-07-31 18:08:06

回答

0

你不打电话给以前的HWND的wndproc。通用调用DefWindowProc()是不正确的。当你为一个HWND子类时,你需要得到旧的wndproc的地址,并传递你不处理的消息,而不是DefWindowProc()。

我不知道如何做firebreath/ATL。

+0

感谢您的解释,我搜索了一个答案(来自MSDN);但不知道为什么其他方式不起作用。由于解释的原因,我会将其标记为答案。 – 2012-08-01 13:45:56