vba如何控制其他程序的消息框?

时间:2015-12-23 21:24:39

标签: windows vba shell

所以我想用

pid = Shell(MyApp, 1)

使用VBA自动使用糟糕的外部程序。不幸的是,这个程序有各种烦人的对话框和必须点击的弹出窗口。有没有办法直接控制每个对话框,以确保" OK"按下按钮而不是"取消"?

目前我正在使用

AppActivate pid
Application.SendKeys ("%R")

但是这个命令只能保证" OK"初始弹出对话框。可能不会点击后续弹出窗口,特别是因为我不确定如何保证关注新弹出窗口。有没有办法找到任何新弹出窗口的子进程ID?有没有办法直接"点击"一个特别贴上标签的控制按钮?

1 个答案:

答案 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再次获取窗口的句柄,如上面的代码所示。