C++ Internet explorer的子窗口闪烁

C++ Internet explorer的子窗口闪烁,c++,internet-explorer,winapi,atl,bho,C++,Internet Explorer,Winapi,Atl,Bho,我正在编写一个browser helper对象,希望在internet explorer窗口中显示一个子窗口,向用户显示一些消息。我使用DS_控件和WS_CHILDWINDOW,希望获得类似于此图中消息的行为: 我成功地插入并显示了一个子窗口,但是窗口在闪烁,有时它是可见的,有时网站内容在z坐标的窗口上方。我试图将子窗口设置为最上面的窗口,但这并没有改变任何事情。如何使子窗口在关闭之前始终可见?以下是我使用的一些源代码: 资源中心: #include <windows.h> #inc

我正在编写一个browser helper对象,希望在internet explorer窗口中显示一个子窗口,向用户显示一些消息。我使用DS_控件和WS_CHILDWINDOW,希望获得类似于此图中消息的行为:

我成功地插入并显示了一个子窗口,但是窗口在闪烁,有时它是可见的,有时网站内容在z坐标的窗口上方。我试图将子窗口设置为最上面的窗口,但这并没有改变任何事情。如何使子窗口在关闭之前始终可见?以下是我使用的一些源代码:

资源中心:

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_NOTIFICATIONBAR DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CONTROL | DS_MODALFRAME | DS_SYSMODAL | DS_SHELLFONT | WS_VISIBLE |  WS_CHILDWINDOW
EXSTYLE WS_EX_TOPMOST
FONT 8, "Ms Shell Dlg"
{
    DEFPUSHBUTTON   "OK", IDOK, 129, 7, 50, 14
    PUSHBUTTON      "Cancel", IDCANCEL, 129, 24, 50, 14
    LTEXT           "Static", IDC_STATIC, 25, 16, 68, 21, SS_LEFT
}

您必须调整MSHTML窗口的大小,以便为控件腾出空间。

尝试通过操纵来为控件腾出空间

  • HWND由
第二个链接还包含一个获取选项卡窗口句柄的示例。但我不知道这是否也适用于BHO,或者只有在托管控件时才有效。

最后我可以解决它(借助于我从下面许多不同答案中获得的信息)

对于有相同问题的人,以下是解决方案: 我必须缩小显示HTML网站的窗口,这样我自己的窗口就不会与它重叠。 为此,我得到了示例中的当前选项卡。 此选项卡窗口包含html文档窗口和状态栏。 所以我给FindWindowEx打了两次电话,获取这两个窗口的HWND:

FindWindowEx(tab,NULL,_T("Shell DocObject View"),_T("")) //html document window
FindWindowEx(tab,NULL,_T("msctls_statusbar32"),_T("")) //status bar
然后调整文档窗口的大小,使其填充除状态栏和对话框之外的整个客户端区域。下面是代码(webbrowser.getCurrentTabHwnd()是上述示例的实现。isShown是一个变量,指示是否应显示我的对话框):


现在必须在每个浏览器窗口调整大小和对话框显示/隐藏时调用这段代码。

如何获取此窗口的引用?您能否发布示例代码(或指向某些文档的链接)以获取引用以及如何正确调整其大小?请使用Spy++获取窗口名称,然后使用FindWindow()。您有权访问IWebBrowser2吗?是的,我有权访问它。这可能会有所帮助。请参阅我的答案,了解您可以尝试修改哪些属性以在HTML页面上腾出空间的建议。
CMyDialog &bar=CMyDialog::getInstance();
bar.ShowWindow(SW_SHOWNORMAL);
FindWindowEx(tab,NULL,_T("Shell DocObject View"),_T("")) //html document window
FindWindowEx(tab,NULL,_T("msctls_statusbar32"),_T("")) //status bar
CWindow tab(webbrowser.getCurrentTabHwnd());
CWindow child(FindWindowEx(tab,NULL,_T("Shell DocObject View"),_T("")));
CWindow statusbar(FindWindowEx(tab,NULL,_T("msctls_statusbar32"),_T("")));

RECT statusbarrect;
statusbar.GetWindowRect(&statusbarrect);
RECT documentrect;
tab.GetClientRect(&documentrect);
documentrect.bottom-=(statusbarrect.bottom-statusbarrect.top);

if(isShown)
{
    //Request document window rect
    static const unsigned int DLGHEIGHT=50;
    RECT dialogrect=documentrect;
    documentrect.top+=DLGHEIGHT;
    dialogrect.bottom=dialogrect.top+DLGHEIGHT;
    //Shrink document window
    MoveWindow(&dialogrect);
}

child.MoveWindow(&documentrect);