使用VS2005的ATL向导生成了一个简单的windows service程序,其中创建了若干线程完成操作IE的一些事务,使用IWebBrowser2接口,但是发现调用完成Navigate2之后,并没有IE窗口显示出来,真是奇怪,同样的代码如果是MFC对话框程序就可以,但是像windows service这种没有界面的程序难道就不可以吗?期待高手解答。
已经使用put_Visible(VARIANT_TRUE)了,调用Navigate2函数以及之前所有函数的返回值都是s_ok,可是就是不显示IE的界面。另外,在windows的任务管理器中已经看见Iexplore进程已经启动。哪位大侠遇见过类似问题,给指条明路吧,多谢。
已经使用put_Visible(VARIANT_TRUE)了,调用Navigate2函数以及之前所有函数的返回值都是s_ok,可是就是不显示IE的界面。另外,在windows的任务管理器中已经看见Iexplore进程已经启动。哪位大侠遇见过类似问题,给指条明路吧,多谢。
IE是基于winhttp的
请问,有别的办法解决么?需要在win service程序中实现类似这样的需求,
只要能操纵网页就可以,比如打开google进行搜索。
再请问,使用createprocess这种方法,如何完成诸如“判断网页是否已经打开”这种操作?
(之前使用IWebBrowser2时,使用了IConnectionPoint的Advise方法建立了通知链接,可以从IDispatch:: Invoke 得到通知)
请问,在windows service程序中,哪种方法可以实现对IE的控制呢?
单独启动一个线程,模拟Explorer用户。
我现在是独立的线程,使用_beginthreadex创建。
请问:如何模拟Explorer用户呢?任务管理器显示的用户有SYSTEM、LOCAL SERVICE、还有当前登录的用户(admin)。
不是没有显示,而是显示在另外的桌面上,我想由于运行windows service的是SYSTEM用户的缘故吧。
在vista下如果运行,会得到一个通知,点击后会进入一个界面只有刚刚被打开的IE窗口,估计就是“SYSTEM”用户的窗口了。
这个问题先这样吧。
--------------------------------------------------------------
目前有一个更棘手且怪异的问题:
代码顺序如下:
1、我在自己创建的线程中createwindow了一个窗口,
2、接着调用
CComPtr<IWebBrowser2> pWB;
hr = pWB.CoCreateInstance(L"InternetExplorer.Application");
3、
然后一些代码完成对DIID_DWebBrowserEvents2接口的“链接”4、
接下来创建一个循环:
while(ture)
{
WaitForMultipleObjects(2, hArr, TRUE, INFINITE))
...... while ((GetMessage(&msg, 0, 0, 0)))
{
if (msg.message == WM_MYQUIT) //自定义消息
{
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}目的是,想在收到WM_MYQUIT消息时,退出循环,等待event被触发,然后重新进入循环。例如:当浏览到特定网页后,发送WM_MYQUIT,退出循环,等待...请问:
(问题一)
整个流程看似正常,但是,每次第四次退出循环后,第五次进入循环,当调用Navigate2成功后,并等待IDISPATCH的invoke被回调时(在invoke函数中,我会调用postmessage函数向窗口发送消息),这时总是出现异常,断点在::DispatchMessage(&msg); 这句代码,真是奇怪?有哪位兄台见过这种情况么?每次都是第五次,真郁闷。
补充:
发送消息使用postmessage函数,第一个参数为我在上面自己创建的窗口的句柄。(问题二),对于等待网页打开完成,我试过几种方法(例如在主循环中使用WaitFor...函数,但是线程就此挂起),所以,似乎必须创建一个窗口来获取消息
如果这的必须这样,谁能解释一下我自己创建的窗口和被打开的IE的窗口有什么关系?如果有其他方法可以不用创建窗口,请不吝赐教,多谢多谢。
这句已经阻塞线程了,后面的消息循环代码执行不到,应该使用MsgWaitForMultiObjects,在等待信号时也可以处理消息循环。
不过现在的现象并非线程被阻塞不运行,而是第五轮调用WaitFor...函数成功后,进入while ((GetMessage(&msg, 0, 0, 0))) 循环,刚刚开始循环两三个消息后,收到一个1024消息,也就是WM_USER,这时,执行到::DispatchMessage(&msg); 这句代码,就异常了...不管怎样,谢谢你关注。