用vb关闭其他程序,为什么找不到窗口??---------------高分

dxw 2003-11-16 02:51:30
Private Sub Timer1_Timer()
Dim winHwnd As Long

Dim RetVal As Long

winHwnd = FindWindow(vbNullString, "internet")
MsgBox winHwnd

If winHwnd〈〉0 Then

RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)

If RetVal = 0 Then

MsgBox "关闭出错!"

End If

Else

MsgBox "internet程序没有运行。"

End If

End Sub

在运行了ie后,以上程序为什么还总显示“internet程序没有运行“
如何解决??????????
...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvlvlvlylyly 2003-11-16
  • 打赏
  • 举报
回复
记得把Text1的MultiLine属性改成True
lvlvlvlylyly 2003-11-16
  • 打赏
  • 举报
回复
对了,就是这样的代码,运行的时候能够准确找到那个要关闭的IE的句柄,可是却的确不能关闭,原因就是前面所说的:一般情况下一个应用程序可通过“运行对象表”(Running Object Table,ROT)来访问其它运行着的应用程序。但由于IE并未将自身注册到 ROT,因此必须用其它方法来获取所有的IE窗口。

所以API函数PostMessage在这里会完全的失败~~~

但是通过ShellWindows对象技术和InternetExplorer对象就可以做到你的要求,即通过IE的标题来判断是否要关闭该窗口。以下是代码,经过调试后成功~

在VB中使用InternetExplorer对象和ShellWindows对象,须打开“菜单->工程->引用”,选中“Microsoft Internet Controls”。


以下是在Form1中:
Option Explicit
Dim IE() As InternetExplorer
Dim C1() As Class1 ' Class1 是自定义的类
Dim Doc
Private Sub Form_Load()
Dim tmp As Long
Text1.Text = ""
Timer1.Interval = 500 ' 定时扫描新的IE窗口
Timer1_Timer
End Sub
Private Sub Timer1_Timer()
On Error Resume Next
Dim i As Integer
Dim SWs As New ShellWindows ' Windows级所有活动窗口的集合
ReDim IE(SWs.Count) As InternetExplorer ' 根据窗口数目来动态定义
ReDim C1(SWs.Count) As Class1
If Len(Text1.Text) > 0 Then
End If
Text1 = vbCrLf + vbCrLf
For i = 0 To SWs.Count - 1
Set IE(i) = SWs.Item(i)
Set Doc = IE(i).Document
If TypeName(Doc) = "HTMLDocument" Then ' 判断是否为IE窗口
Text1 = Text1 + Doc.Title + vbCrLf
Debug.Print Doc.Title
If InStr(Doc.Title, "搜狐首页") > 0 Then ' 注意这个"搜狐首页",如果是英文IE对大小写是很敏感的~我是用搜狐首页来试的,你可以换成其他的,但不能是空的,我前面之所以拿空的举例,只是一个说法~因为我比较懒,想不到别的,IE的标题通常都很长,实在懒的写
Text1 = Text1 + "搜狐首页------查到一个符合条件的窗口,已经关闭" + vbCrLf 'vbCrLf换行符
IE(i).Quit
Timer1.Enabled = False ' 关闭之后Timer1停止
End If
Set C1(i) = New Class1
C1(i).Begin IE(i) ' 启动对该IE窗口的监控
End If
Next

End Sub


以下是在类模块(Class1)中:
' 自定义类的代码(Class1.cls)
Option Explicit
Dim WithEvents TheIE As InternetExplorer
Public Sub Begin(IE1 As InternetExplorer) ' 类的初始化
Set TheIE = IE1
End Sub




lvlvlvlylyly 2003-11-16
  • 打赏
  • 举报
回复
妈的,这个问题你一定要给我分!!我为了给你回答,专门又去研究了一下我以前早就甩掉的程序~都快要忘的一干二净了~

如果你用类名查找,当然可以找到IE窗口,但是你怎么能确定哪一个是你要关的呢?用IE的标题是做不到这一点的,因为一般情况下一个应用程序可通过“运行对象表”(Running Object Table,ROT)来访问其它运行着的应用程序。但由于IE并未将自身注册到 ROT,因此必须用其它方法来获取所有的IE窗口。所以你前面自己所写的程序总是出现“internet程序没有运行”的提示。当然,如果你把自己的代码仔细看一看, 可能会觉得不妥。检查一下语法之后,再运行老是出现“关闭出错!"的提示


好好看看,你的代码写的有问题,正确的结果应该是出现这个提示。首先你要保证你的IE标题是“internet”,可是你如何保证?IE标题是很敏感的,多一个空格少一个空格都是不同的东西,如此,你可能会想到打开一个空的IE。即将IE的设置里面把默认的主页改成“about:blank”,这样一来,你寻找的IE标题就应该是“about:blank - Microsoft Internet Explorer”。精简之后的代码如下(不要用Timer事件):
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10

Private Sub Command1_Click()
Dim winHwnd As Long

Dim R As Long

winHwnd = FindWindow(vbNullString, "about:blank - Microsoft Internet Explorer")
MsgBox winHwnd

If winHwnd〈〉0 Then

R = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)

End If

If R = 0 Then

MsgBox "关闭出错!"
Else

MsgBox "internet程序没有运行。"

End If
End Sub



rainstormmaster 2003-11-16
  • 打赏
  • 举报
回复
建议使用类名进行查找
lxqlogo0 2003-11-16
  • 打赏
  • 举报
回复
winHwnd = FindWindow(vbNullString, "internet")
"internet"要是窗口的全称才行。
iwzw 2003-11-16
  • 打赏
  • 举报
回复
楼上讲的有道理。
下面的代码通过测试,可以关闭计算器:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10
Private Sub Command1_Click()
Dim winHwnd As Long

Dim RetVal As Long

winHwnd = FindWindow(vbNullString, "计算器")
MsgBox winHwnd

If winHwnd <> 0 Then

RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)

If RetVal = 0 Then

MsgBox "关闭出错!"

End If

Else

MsgBox "程序没有运行。"

End If

End Sub
FSoft 2003-11-16
  • 打赏
  • 举报
回复
可能是你的标题不对(internet)

7,771

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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