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