|
本帖最后由 goldowl2011 于 2012-5-31 13:20 编辑
请教问题:
我在做一个抓取内网信息的VBA程序,主体已经完成,但该网站很奇怪:在执行完查询后,因该网页采用 了.document.add.submit()自动提交方式处理,造成在完成查询后,又会自动打开一个IE窗口并自动运行前面的查询过程,但由于已没有参数传递,故造成弹出错误提示,且无法取得其控制权,用sendkeys "{Enter}"也无效,程序在最后无法完美收关,ie无法自动关闭退出。
我的思路是,是否可以做一个定时器,在最后一次循环查询操作结束后的指定时间后,用下列几种方法进行处理(目前尚未成功:-(,代码来自或修改自网络/论坛)
1、直接用代码处理
Public Sub GetIEWinandCloseit() ' 直接关闭所有IE窗口
On Error Resume Next
Dim Phwnd&, Rtn&, ChkFile$
Dim mShellWindow As New SHDocVw.ShellWindows
Dim mIndex As Long
For mIndex = 0 To mShellWindow.count - 1
If VBA.TypeName(mShellWindow.Item(mIndex).Document) = "HTMLDocument" Then
ChkFile = mShellWindow.Item(mIndex).Document.URL
'Print ChkFile
Debug.Print ChkFile
'Close ie window
Phwnd = mShellWindow.Item(mIndex).Hwnd
PostMessage Phwnd, WM_CLOSE, 0, 0 '关闭
End If
Next mIndex
End Sub
2、用API遍历进程,再
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal Hwnd As Long) As Long
Dim dWinFolder As New ShellWindows
Dim objIE As Object, myHWND, objIE2 As Object
Dim Czpmxurl As String, Czpmxname As String
Dim Czpmxhwnd As Long, aA '窗口句柄
Dim sm
Czpmxhwnd = FindWindow(vbNullString, "**平台管理系统 - Windows Internet Explorer")
aA = SetForegroundWindow(Czpmxhwnd) '将网页调到前台
Application.Wait now + TimeValue("00:00:01") '' 程序休息
SendKeys "%{F4}"
SendKeys "{ENTER}", True
IE.Quit
Application.Wait now + TimeValue("00:00:02") '' 程序休息
SendKeys "{ENTER}", True
'Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
Set IE = Nothing
2、用tasklist取得进程列表,再用Shell "taskkill /F /IM iexplore.exe /T" 或 Shell "ntsd -c q -p " & pid方式强行将所有ie进程杀掉,以曲线救国方式完成程序结束操作。
Public Sub gameover_ie()
On Error Resume Next
Dim objSet
Set objSet = GetObject("winmgmts:").InstancesOf("Win32_Process")
For Each Item In objSet
If Item.Name = "iexplore.exe" Then
pid = Item.Handle
Shell "ntsd -c q -p " & pid
End If
Next
End Sub
请大侠(如弦月大师等)能给个建议或示例什么的,我试了各种方法,就是无法取得其控制权,因新弹出的IE窗口不是在我的程序控制范围之内,也不在我的查询循环中,真的很头痛,请赐教!
|
|