Есть ли в Firefox окно уведомлений IE, например gBrowser.getNotificationBox () - PullRequest
1 голос
/ 08 августа 2011

Объект помощника браузера, который я пишу в данный момент, должен предупредить пользователя о определенных ситуациях.Я не хочу использовать функцию WinAPI MessageBox, потому что она заставляет пользователя щелкнуть ее.Есть ли возможность задать пользователю вопрос, не блокируя его рабочий процесс?Он должен быть в состоянии просто проигнорировать вопрос, если он не заинтересован в нем в данный момент.Что-то вроде gBrowser.getNotificationBox () для расширений Firefox было бы идеально (пример изображения добавлен).Firefox gBrowser.getNotificationBox()

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Я наконец-то смог это решить.Ответ ниже и ответы на этот вопрос помогли мне.Там вы также можете найти дополнительную информацию об этой проблеме.Если у кого-то есть такая же проблема, вот мой код.Я не думаю, что он будет компилироваться без остальной части кода моего проекта, но он должен дать представление о том, как реализовать такое диалоговое окно в объекте помощника браузера:

Заголовок:

#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 () для каждого изменения размераокна браузера.Для этого вы можете использовать IHTMLWindow3 :: attachEvent (_T ("onresize"), ...) в событии DocumentComplete IE.

Вот способ получить экземпляр IHTMLWindow3 в обработчике DocumentComplete:

  1. IWebBrowser2 :: getDocument () возвращает IHTMLDocument2
  2. IHTMLDocument2 :: get_parentWindow () возвращает IHTMLWindow2
  3. IHTMLWindow2 :: QueryInterface (IID_IH23T) успешное окно*
0 голосов
/ 10 августа 2011

Вы можете создать свое собственное окно и использовать SetWindowPos, чтобы переместить его в окно IE.

Если вы хотите быть в безопасности, я предлагаю вам написать полосу браузера

Пока нет API для настройки содержимого информационной панели, также известной как полоса безопасности.

...