BHO里弹出新窗口,如何控制新窗口的大小?

ezdevelop 2006-05-23 12:38:55
BOOL PopupWindowEx(IWebBrowser2 *pWebBrowser, BSTR bstrUrl, int top, int left, int width, int height)
{
if (pWebBrowser == NULL) return FALSE;

VARIANT vtFlags, vtEmpty;
vtFlags.vt = VT_I4;
vtFlags.lVal = navOpenInNewWindow;
::VariantInit(&vtEmpty);

if (top >= 0) pWebBrowser->put_Top(top);
if (left >= 0) pWebBrowser->put_Left(left);
if (width >= 0) pWebBrowser->put_Width(width);
if (height >= 0) pWebBrowser->put_Height(height);

pWebBrowser->put_Visible(VARIANT_TRUE);
pWebBrowser->Navigate(bstrUrl, &vtFlags, &vtEmpty, &vtEmpty, &vtEmpty);
::VariantClear(&vtFlags);
::VariantClear(&vtEmpty);
return TRUE;
}

上面这个函数只能针对父窗口的,不能改变新窗口的大小.

而下面这个函数,如果开了MYIE,焦点会转移到MYIE,但是新窗口没有处理.
如果没开MYIE,则窗口能弹出来,但是也不能控制大小的.
BOOL PopupWindowEx(LPCTSTR lpszUrl, int top, int left, int width, int height)
{
//::CoInitialize(NULL);
IWebBrowser2 *pWebBrowser = NULL;
HRESULT hr;

hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pWebBrowser);
if(FAILED(hr) || pWebBrowser == NULL) return FALSE;

VARIANT vtUrl, vtFlags, vtTarget, vtEmpty;
vtUrl.vt = VT_BSTR;
vtUrl.bstrVal = CComBSTR(lpszUrl);
vtFlags.vt = VT_I4;
vtFlags.lVal = navOpenInNewWindow;
vtTarget.vt = VT_BSTR;
vtTarget.bstrVal = CComBSTR("_blank");
::VariantInit(&vtEmpty);

if (top >= 0) pWebBrowser->put_Top(top);
if (left >= 0) pWebBrowser->put_Left(left);
if (width >= 0) pWebBrowser->put_Width(width);
if (height >= 0) pWebBrowser->put_Height(height);

//pWebBrowser->put_Visible(VARIANT_TRUE);
hr = pWebBrowser->Navigate2(&vtUrl, &vtEmpty, &vtTarget, &vtEmpty, &vtEmpty);

::VariantClear(&vtFlags);
::VariantClear(&vtTarget);
::VariantClear(&vtEmpty);

pWebBrowser->Quit();
pWebBrowser->Release();
pWebBrowser = NULL;

//::CoUninitialize();

return SUCCEEDED(hr);
}

请问控制新窗口的大小应该怎么做呢?
...全文
368 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cici2006 2006-05-25
  • 打赏
  • 举报
回复
你导航过去后就去得到文档。肯定没有呀。。文档没有下载下来之前IWebBrowse是没有文档对象的。
你可sleep一下。或者把连接点挂过去。响应它的文档下载完所的消息。
蒋晟 2006-05-24
  • 打赏
  • 举报
回复
www.codeproject.com/shell/AutomateShellWindow.asp
leechiyang 2006-05-24
  • 打赏
  • 举报
回复
mark
ezdevelop 2006-05-24
  • 打赏
  • 举报
回复
我晕倒,借地方也不用这么借吧!
qinjs 2006-05-24
  • 打赏
  • 举报
回复
其实主要是也想问问你了

to jiangsheng(蒋晟.Net[MVP])
char surl[] = "http://www.csdn.net";

这样也不行啊
蒋晟 2006-05-23
  • 打赏
  • 举报
回复
char surl[] = "http://www.csdn.net";
qinjs 2006-05-23
  • 打赏
  • 举报
回复
HRESULT CCEyeOnIE::CreateNewIEWindow() //创建新窗口,并导航到指定的URL
{
//IWebBrowser2 *pWebBrowser = NULL;
CComQIPtr<IWebBrowser2> m_pWebBrowser2;
HRESULT hr;
hr = m_pWebBrowser2.CoCreateInstance(CLSID_InternetExplorer);
hr = m_pWebBrowser2->put_StatusBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_ToolBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_MenuBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_Visible(VARIANT_TRUE);

char surl[] = "www.csdn.net";
CComVariant vaURL( ( LPCTSTR) surl);

m_pWebBrowser2->Navigate2( &vaURL,0 ,
NULL,
NULL,
NULL
);

return S_OK;
}
这里借用一下地方:
请问BHO的里面,我这段代码打开新窗口的时候,怎么还是是空白的,导航不到www.csdn.net ???
还需要什么吗?
ezdevelop 2006-05-23
  • 打赏
  • 举报
回复
首先感谢您的热心回复!

问题就是偶不知道如何获取B的IWebBrowser2,如果采用如下代码方式获取IWebBrowser2,那么是获取不了IHTMLDocument2的:

BOOL PopupWindow(LPCTSTR lpszUrl, int top, int left, int width, int height)
{
//::CoInitialize(NULL);
IWebBrowser2 *pWebBrowser = NULL;
HRESULT hr;

hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pWebBrowser);
if(FAILED(hr) || pWebBrowser == NULL) return FALSE;

VARIANT vtFlags, vtEmpty;
vtFlags.vt = VT_I4;
vtFlags.lVal = navOpenInNewWindow;
::VariantInit(&vtEmpty);

if (top >= 0) pWebBrowser->put_Top(top);
if (left >= 0) pWebBrowser->put_Left(left);
if (width > 0) pWebBrowser->put_Width(width);
if (height > 0) pWebBrowser->put_Height(height);

pWebBrowser->put_Visible(VARIANT_TRUE);
hr = pWebBrowser->Navigate(CComBSTR(lpszUrl), &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty);

CComPtr<IDispatch> pDispatch;
pWebBrowser->get_Document(&pDispatch);
if (FAILED(hr)) {
return FALSE;
}
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pHtml;
pHtml = pDispatch;

if (pHtml) {
CComPtr<IHTMLWindow2> pWindow;
hr = pHtml->get_parentWindow(&pWindow);
if (SUCCEEDED(hr)) {
pWindow->resizeBy(top, left);
pWindow->resizeTo(width, height);
}
}

::VariantClear(&vtFlags);
::VariantClear(&vtEmpty);

pWebBrowser->Quit();
pWebBrowser->Release();
pWebBrowser = NULL;

//::CoUninitialize();

return SUCCEEDED(hr);
}
lion_wing 2006-05-23
  • 打赏
  • 举报
回复
把B的IWebbrowser2传递进去不就行了?
ezdevelop 2006-05-23
  • 打赏
  • 举报
回复
这个只能针对当前窗口,并不能操作新打开的那个窗口,我要进行控制的是新打开的那个窗口

比如,A里打开了B,我要做的就是改变B的大小,而不是A的大小.
lion_wing 2006-05-23
  • 打赏
  • 举报
回复
HRESULT IWebBrowser2::get_Document(IDispatch **ppDisp);
HRESULT IHTMLDocument2::get_parentWindow(IHTMLWindow2 **p);
IHTMLWindow2::resizeBy
IHTMLWindow2::resizeTo
你可以试试
ezdevelop 2006-05-23
  • 打赏
  • 举报
回复
怎么操作新窗口呢?起码应该有个句柄吧,这个句柄在哪?

麻烦再解释一下,Thanks!
lion_wing 2006-05-23
  • 打赏
  • 举报
回复
IHTMLWindow2::resizeBy
IHTMLWindow2::resizeTo
ezdevelop 2006-05-23
  • 打赏
  • 举报
回复
anybody could help me?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧