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 IfEnd Sub  在运行了ie后,以上程序为什么还总显示“internet程序没有运行“
如何解决??????????

解决方案 »

  1.   

    楼上讲的有道理。
    下面的代码通过测试,可以关闭计算器:
    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 IfEnd Sub
      

  2.   

    winHwnd = FindWindow(vbNullString, "internet")
    "internet"要是窗口的全称才行。
      

  3.   

    妈的,这个问题你一定要给我分!!我为了给你回答,专门又去研究了一下我以前早就甩掉的程序~都快要忘的一干二净了~如果你用类名查找,当然可以找到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 = &H10Private 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
      

  4.   

    对了,就是这样的代码,运行的时候能够准确找到那个要关闭的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
    NextEnd Sub
    以下是在类模块(Class1)中:
    ' 自定义类的代码(Class1.cls)
    Option Explicit
    Dim WithEvents TheIE As InternetExplorer
    Public Sub Begin(IE1 As InternetExplorer) ' 类的初始化
    Set TheIE = IE1
    End Sub
      

  5.   

    记得把Text1的MultiLine属性改成True