启动IE进程,怎么控制打开的IE的大小和位置

I_believe328 2008-11-25 09:09:24
我的程序中点击一个按钮,启动一个IE进程,我想控制打开的IE的位置和大小,能做到吗?请指教。
...全文
289 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_believe328 2008-12-02
  • 打赏
  • 举报
回复
貌似用个循环,每次获得窗口位置与我们的设置比较,不相同始终设置窗口位置,这样可以解决问题。
DavidHsing 2008-11-28
  • 打赏
  • 举报
回复
mark,顶!
KeSummer 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 I_believe328 的回复:]
我们是希望每次去启动一个新的IE进程,不希望把当前的IE页替换掉。
[/Quote]

是开新窗口,IE是多窗口程序来的~~
I_believe328 2008-11-28
  • 打赏
  • 举报
回复
我们是希望每次去启动一个新的IE进程,不希望把当前的IE页替换掉。
KeSummer 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 I_believe328 的回复:]
To KeSummer:
我试了你的代码,也是有同样的问题的。即窗口位置会被注册表里的位置覆盖。
还出现了2个窗口。
[/Quote]

最简单就是将 visible设置为false,hwnd属性不为NULL的时候,设置坐标值,再设置为true,这时应该可以瞒天过海了。
或者HOOK注册表操作,拦截对window_placement的访问。
I_believe328 2008-11-28
  • 打赏
  • 举报
回复
To KeSummer:
我试了你的代码,也是有同样的问题的。即窗口位置会被注册表里的位置覆盖。
还出现了2个窗口。
KeSummer 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 I_believe328 的回复:]
谢谢KeSummer
我们是用CreateProcess()创建进程的
我们在测试中发现hIE = ::FindWindowEx(NULL,NULL,_T("IEFrame"),NULL);没有问题
倒是if(WaitForInputIdle(pi.hProcess,10000) == 0)//wait until initiall successful
有问题,可能出现没等IE窗口初始化完成就调用SetWindowPos()。如果Sleep一下到是可以。
看msdn该函数应该有这个功能,不知道原因。
[/Quote]

1:我那段代码是直接创建IE进程的(但是你开了IE窗口,则会使用原来的进程来创建窗口,如果你的默认浏览器是遨游或者TT则会调用他们)
2:进程创建窗口后会MoveWindow的,很多程序都是这样。
I_believe328 2008-11-27
  • 打赏
  • 举报
回复
谢谢KeSummer
我们是用CreateProcess()创建进程的
我们在测试中发现hIE = ::FindWindowEx(NULL,NULL,_T("IEFrame"),NULL);没有问题
倒是if(WaitForInputIdle(pi.hProcess,10000) == 0)//wait until initiall successful
有问题,可能出现没等IE窗口初始化完成就调用SetWindowPos()。如果Sleep一下到是可以。
看msdn该函数应该有这个功能,不知道原因。
KeSummer 2008-11-27
  • 打赏
  • 举报
回复

#include <ExDisp.h>
IWebBrowser2 * m_pIE;
CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_LOCAL_SERVER,IID_IWebBrowser2,(LPVOID *)&m_pIE);
m_pIE->put_Visible(VARIANT_TRUE);
m_pIE->put_Width(800);//设置宽
m_pIE->put_Height(600);//高
m_pIE->put_Left(100);//左
m_pIE->put_Top(200);//顶

COleSafeArray vPostData;
COleVariant vURL(_T("http://www.csdn.net"), VT_BSTR);
COleVariant vHeaders("", VT_BSTR);
COleVariant vTargetFrameName("", VT_BSTR);
COleVariant vFlags((long) 0, VT_I4);
//访问CSDN
m_pIE->Navigate2(vURL,
vFlags, vTargetFrameName, vPostData, vHeaders);
I_believe328 2008-11-27
  • 打赏
  • 举报
回复
因为我们原来用不创建新进程有个问题的,所以我们现在就用CreateProcess创建进程
WaitForInputIdle()对它不起作用。
KeSummer 2008-11-26
  • 打赏
  • 举报
回复
自动化IE,设置Top,Left,Width,Height属性。
yanjing_mail 2008-11-26
  • 打赏
  • 举报
回复
学习
zzz822163 2008-11-26
  • 打赏
  • 举报
回复
CreateWindow你调用不了,是系统自己实现的,就是说对付IE不能用这种方法
I_believe328 2008-11-26
  • 打赏
  • 举报
回复
我现在是在创建进程后,捕获窗口句柄,用SetWindowPos设置的
HWND hIE = NULL;
if(WaitForInputIdle(pi.hProcess,10000) == 0)//wait until initiall successful
{
hIE = ::FindWindowEx(NULL,NULL,_T("IEFrame"),NULL);
}
if(hIE!=NULL)
{
::SetWindowPos(hIE,HWND_TOP,0,0,200,200,SWP_SHOWWINDOW);
}
已经可以实现。
但我对::FindWindowEx(NULL,NUll,_T("IEFrame"),NULL);
还有点不放心,它怎么保证找到的就是我创建的IE进程呢,不会与其他已有的IE混淆呢。谁对这个函数比较熟悉的,望指教。
I_believe328 2008-11-26
  • 打赏
  • 举报
回复
To zzz822163:
但我没有人为的去调iexplore.exe的CreateWindow啊,我怎么设置CW_USEDEFAULT?
zzz822163 2008-11-25
  • 打赏
  • 举报
回复
如果不行的话,你在打开IE后取到窗体句柄,用setwindowpos吧
hellward 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzz822163 的回复:]
HKEY_CURRENT_USER\software\microsoft\internet  explorer\main下的window_placement记录了IE浏览器启动的大小和位置
启动之前修改他看看
[/Quote]嗯
zzz822163 2008-11-25
  • 打赏
  • 举报
回复
HKEY_CURRENT_USER\software\microsoft\internet explorer\main下的window_placement记录了IE浏览器启动的大小和位置
启动之前修改他看看
zzz822163 2008-11-25
  • 打赏
  • 举报
回复
For GUI processes, this is used only the first time the new process calls CreateWindow to create an overlapped window if the nWidth parameter of CreateWindow is CW_USEDEFAULT.


看msdn的说明,还要对应的exe 程序在调用 CreateWindow 时,
带有 CW_USEDEFAULT 这个标记
I_believe328 2008-11-25
  • 打赏
  • 举报
回复
各位说的有理,用CreateProcess()的STARTUPINFO好像对IE不起作用的。
加载更多回复(1)

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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