在Firefox中是否有像gBrowser.getNotificationBox()这样的IE通知框

时间:2011-08-08 17:03:03

标签: internet-explorer bho

我正在编写的浏览器帮助程序对象需要提醒用户某些情况。 我不想使用WinAPI函数MessageBox,因为它强制用户单击它。 是否有可能在不阻止其工作流程的情况下向用户询问问题?如果他现在对此不感兴趣,他应该能够忽略这个问题。 对于firefox扩展,像gBrowser.getNotificationBox()这样的东西是理想的(附加示例图像)。 Firefox gBrowser.getNotificationBox()

2 个答案:

答案 0 :(得分:0)

您可以创建自己的窗口并使用SetWindowPos将其移动到IE窗口中。

如果你想安全玩耍,我建议你写一个browser band

还没有一个API可以自定义信息栏的内容,即安全带。

答案 1 :(得分:0)

我终于可以解决了。下面的答案和this问题中的答案对我有帮助。在那里,您还可以找到有关此问题的更多信息。 如果有人有同样的问题,这是我的代码。我不认为它会在没有其他项目代码的情况下编译,但是它应该给出一个想法,如何在浏览器帮助器对象中实现这样的对话框:

部首:

#include "atlbase.h"
#include "atlwin.h"
#include "resources/resource.h"
#include <string>

class NotificationBar : public CDialogImpl<NotificationBar>
{
public:
    NotificationBar();

    enum { IDD = IDD_NOTIFICATIONBAR };

    BEGIN_MSG_MAP(CMyDialog)
        COMMAND_HANDLER(IDC_CANCEL, BN_CLICKED, OnBnClickedCancel)
    END_MSG_MAP()

    void show(const std::string &message);

    void show();

    void fitSize();

    void hide();

    void setText(const std::string &text);

private:

    LRESULT OnBnClickedCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

    bool isShown;
};

来源:

#include "NotificationBar.hpp"

NotificationBar::NotificationBar()
    :isShown(false)
{
}

void NotificationBar::show(const std::string &message)
{
    show();
    setText(message);
}

void NotificationBar::show()
{
    if(isShown)
    {
        fitSize();
        return;
    }
    isShown=true;

    WebBrowser webbrowser(BrowserHelperObject::getInstance().getBrowser());
    //Create dialog
    Create(webbrowser.getCurrentTabHwnd());
    //Set dialog size
    fitSize();
    ShowWindow(SW_SHOWNORMAL);
}

void NotificationBar::hide()
{
    if(!isShown) return;
    ShowWindow(SW_HIDE);
    DestroyWindow();
    isShown=false;
    fitSize();
}

void NotificationBar::fitSize()
{
    //This method is highly non portable. I is possible that it will not work in future versions of
    //Internet explorer. It is dependend on the layout of the IE window and on the class names
    //of its child windows (status bar, document view, ...).
    //If the plugin gets some strange layout on future versions of IE or doesn't show a message at all,
    //check and change this function.

    WebBrowser webbrowser(BrowserHelperObject::getInstance().getBrowser());
    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);
}

LRESULT NotificationBar::OnBnClickedCancel(WORD, WORD, HWND , BOOL&)
{
    hide();
    return 0;
}

void NotificationBar::setText(const std::string &text)
{
    if(0==SetDlgItemText(IDC_TEXT, CA2W(text.c_str())))
        ieaddon::util::bho::BrowserHelperObject::getInstance().ErrorMessageBox("Error",ieaddon::util::cast::IntToStr(GetLastError()));
}

webbrowser.getCurrentTabHwnd()函数返回当前标签窗口:

HWND WebBrowser::getCurrentTabHwnd()
{
    CComPtr<IServiceProvider> pServiceProvider;
    if (!SUCCEEDED(_browser->QueryInterface(IID_PPV_ARGS(&pServiceProvider))))
        throw std::exception("QueryInterface for IID_IServiceProvider failed in WebBrowser::getCurrentTabHwnd()");

    CComPtr<IOleWindow> pWindow;
    if (!SUCCEEDED(pServiceProvider->QueryService(SID_SShellBrowser, IID_PPV_ARGS(&pWindow))))
        throw std::exception("QueryService for SID_SShellBrowser, IID_IOleWindow failed in WebBrowser::getCurrentTabHwnd()");

    HWND hwndBrowser = NULL;
    if (!SUCCEEDED(pWindow->GetWindow(&hwndBrowser)))
        throw std::exception("GetWindow failed in WebBrowser::getCurrentTabHwnd()");

    return hwndBrowser;
}

您还必须在浏览器窗口的每个大小调整上调用NotificationBar :: fitSize()。为此,您可以在IE的DocumentComplete事件中使用IHTMLWindow3 :: attachEvent(_T(“onresize”),...)。

这里是在DocumentComplete处理程序中获取IHTMLWindow3实例的方法:

  1. IWebBrowser2 :: getDocument()返回IHTMLDocument2
  2. IHTMLDocument2 :: get_parentWindow()返回IHTMLWindow2
  3. IHTMLWindow2 :: QueryInterface(IID_IHTMLWindow3,...)成功