要求:
我只想关掉我写的程序中弹出的窗口(我的程序不一定运行在最前!弹出窗口是不定时出现的一个MSGBOX,我用timer每秒检查一次,如果有这类窗口就关掉.).那么,怎么准确找到这个窗口的hWnd,或者是有其他办法呢?我是用FindWindow + SendMessage 试过,当程序不在最前的时候就不能关掉弹出窗口了.(请高手指教! 分数不多,显丑了!)
我只想关掉我写的程序中弹出的窗口(我的程序不一定运行在最前!弹出窗口是不定时出现的一个MSGBOX,我用timer每秒检查一次,如果有这类窗口就关掉.).那么,怎么准确找到这个窗口的hWnd,或者是有其他办法呢?我是用FindWindow + SendMessage 试过,当程序不在最前的时候就不能关掉弹出窗口了.(请高手指教! 分数不多,显丑了!)
SendMessage 有很多种
WM_COMMAND
BM_CLICK
WM_KEYDOWN+WM_KEYUP
都可以实现单击按钮。监视msgbox的操作可以用timer、hook。
(现在问题的关键是我不能准确的得到弹出窗口的hWnd,后果是把其他的对象关了)
其他的程序是否有弹出的窗口我不关.
可以监视窗体的创建激活等等
顯示自動關閉的對話框
Sub AutoClose()
With CreateObject("Wscript.shell")
.popup "3秒后關閉!", 3, "關閉", 64
End With
End Sub
我只想关掉我写的程序中弹出的窗口(我的程序不一定运行在最前!弹出窗口是不定时出现的一个MSGBOX,我用timer每秒检查一次,如果有这类窗口就关掉.).
'''''
弹出的窗口有父窗口,楼主应该知道是哪一个吧。出现msgbox的时候父窗口会失去焦点。
既然你发现了msgbox并且hWnd也知道,现在的问题就是用这个hWnd来判断是不是属于你的程序。
有个API函数用这个hWnd作为参数可以得到应用程序的路径名字如果是
App.path & "\" & app.name & ".exe"这样就说明找到的窗口属于你的程序。
能给段代码参考一下吗?谢谢!
我试了,没成功.
App.path & "\" & app.name & ".exe"这样就说明找到的窗口属于你的程序。
Api忘记了,好可惜在家里,找到了帮你放上来。我的程序中用了,只要是窗口就能发现他所在的程序目录及名字,即时hwnd是按钮或者图片等控件的hwnd
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
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以及常数
我结贴了,准备回家过年了.~~~