所以我想用
pid = Shell(MyApp, 1)
使用VBA自动使用糟糕的外部程序。不幸的是,这个程序有各种烦人的对话框和必须点击的弹出窗口。有没有办法直接控制每个对话框,以确保" OK"按下按钮而不是"取消"?
目前我正在使用
AppActivate pid
Application.SendKeys ("%R")
但是这个命令只能保证" OK"初始弹出对话框。可能不会点击后续弹出窗口,特别是因为我不确定如何保证关注新弹出窗口。有没有办法找到任何新弹出窗口的子进程ID?有没有办法直接"点击"一个特别贴上标签的控制按钮?
答案 0 :(得分:1)
好吧,有一种方法可以将WM_COMMAND
消息发送到对话框上的常用按钮,从而有效地关闭它:
Declare Function SendMessageA Lib "user32" (ByVal hWnd As Long, ByVal Msg As Integer, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Const WM_COMMAND As Integer = 273
Const WM_CLOSE As Integer = 16
Const IDOK As Integer = 1
Const IDCANCEL As Integer = 2
Sub ShowDialogs()
If Shell("C:\Users\myself\dialogs.exe") <> 0 Then
Dim hWnd As Long
hWnd = FindWindowA("#32770", "Info")
Debug.Print hWnd
SendMessageA hWnd, WM_COMMAND, IDOK, 0
End If
End Sub
我不得不使用Spy ++来找出Windows为消息框对话框提供的类名。
Windows SDK标头包含有用的常量,尤其是从WinUser.h获取的WM_COMMAND
的值。
每次创建对话框时,您都需要使用FindWindowA
再次获取窗口的句柄,如上面的代码所示。