要求:
我只想关掉我写的程序中弹出的窗口(我的程序不一定运行在最前!弹出窗口是不定时出现的一个MSGBOX,我用timer每秒检查一次,如果有这类窗口就关掉.).那么,怎么准确找到这个窗口的hWnd,或者是有其他办法呢?我是用FindWindow + SendMessage 试过,当程序不在最前的时候就不能关掉弹出窗口了.(请高手指教! 分数不多,显丑了!)

解决方案 »

  1.   


    SendMessage 有很多种
    WM_COMMAND
    BM_CLICK
    WM_KEYDOWN+WM_KEYUP
    都可以实现单击按钮。监视msgbox的操作可以用timer、hook。
      

  2.   

    我想得到当前程序中弹出的MsgBox窗口.并关掉!
    (现在问题的关键是我不能准确的得到弹出窗口的hWnd,后果是把其他的对象关了)
    其他的程序是否有弹出的窗口我不关.
      

  3.   

    在Timer事件中用msgbox,简直开国际玩笑!如果是测试呢,建议用debug.print "sdfgdfs="& sdfgdfs,VB会在立即窗口中显示sdfgdfs的结果值,并且VB在编译时会忽略debug.print。
      

  4.   

    不是回答你了监视SHELL消息啊
    可以监视窗体的创建激活等等
      

  5.   

    把你程序中的msgbox改为用以下代码
    顯示自動關閉的對話框
    Sub AutoClose()
        With CreateObject("Wscript.shell")
             .popup "3秒后關閉!", 3, "關閉", 64
        End With
    End Sub
      

  6.   

    要求:
    我只想关掉我写的程序中弹出的窗口(我的程序不一定运行在最前!弹出窗口是不定时出现的一个MSGBOX,我用timer每秒检查一次,如果有这类窗口就关掉.).
    '''''
    弹出的窗口有父窗口,楼主应该知道是哪一个吧。出现msgbox的时候父窗口会失去焦点。
    既然你发现了msgbox并且hWnd也知道,现在的问题就是用这个hWnd来判断是不是属于你的程序。
    有个API函数用这个hWnd作为参数可以得到应用程序的路径名字如果是
    App.path & "\" & app.name & ".exe"这样就说明找到的窗口属于你的程序。
      

  7.   

    Public Declare Function GetParent Lib "user32" Alias "GetParent" (ByVal hwnd As Long) As Long获取父窗口句柄。判断是否和你的程序句柄一样
      

  8.   

    To: chenhui530(陈辉) ,用SHELL消息监视窗体的创建激活,我不会用.
    能给段代码参考一下吗?谢谢!
      

  9.   

    To: HotUs(落后了) ,你的方法怎么判断?能说明一下吗.
    我试了,没成功.
      

  10.   

    弹出的窗口有父窗口有个API函数用这个hWnd作为参数可以得到应用程序的路径名字如果是
    App.path & "\" & app.name & ".exe"这样就说明找到的窗口属于你的程序。
    Api忘记了,好可惜在家里,找到了帮你放上来。我的程序中用了,只要是窗口就能发现他所在的程序目录及名字,即时hwnd是按钮或者图片等控件的hwnd
      

  11.   

    '恭喜楼主找到了返回程序路径以及名字带扩展名
    Public Function GetPath(ByVal hwnd As Long) As String
           Dim hProcess   As Long
           Dim ProcID   As Long
           Dim mModules(1 To 200)     As Long
           Dim cbNeed   As Long
           Dim ModuleName   As String
           Dim nSize   As Long
           Dim lRet   As Long
           GetWindowThreadProcessId hwnd, ProcID
           hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcID)
           lRet = EnumProcessModules(hProcess, mModules(1), 200, cbNeed)
           If lRet <> 0 Then
                   ModuleName = Space(MAX_PATH)
                   nSize = 500
                   lRet = GetModuleFileNameExA(hProcess, mModules(1), ModuleName, nSize)
                   GetPath = Left(ModuleName, lRet)
           End If
           lRet = CloseHandle(hProcess)
    End Function
      

  12.   

    Public Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Public Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
    Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongDeclare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Const PROCESS_QUERY_INFORMATION = 1024
    Public Const PROCESS_VM_READ = 16
    Public Const MAX_PATH = 260
    这是用到的API以及常数
      

  13.   

    To: xx22nn() ,多谢啊!To All:谢谢大家费心了,祝大家猪年心想事成!
    我结贴了,准备回家过年了.~~~