Vb.net 捕获应用程序';s弹出消息框

Vb.net 捕获应用程序';s弹出消息框,vb.net,process,popup,automation,Vb.net,Process,Popup,Automation,我必须使用VB.Net自动执行windows应用程序的重复任务(无API) 我所做的是模拟通常由用户完成的按键。 我正在使用System.Threading,并使用新进程启动应用程序 我的问题是,当任务完成时,该应用程序会弹出一个消息框,并且该消息框肯定会禁用主应用程序窗口,因此我需要知道何时显示该消息框以模拟输入键笔划并继续执行下一个任务 以下是我的代码示例: Imports System.Threading Public Class Form1 Dim a As New Proce

我必须使用
VB.Net
自动执行windows应用程序的重复任务(无API)

我所做的是模拟通常由用户完成的按键。 我正在使用
System.Threading
,并使用新进程启动应用程序

我的问题是,当任务完成时,该应用程序会弹出一个消息框,并且该消息框肯定会禁用主应用程序窗口,因此我需要知道何时显示该消息框以模拟输入键笔划并继续执行下一个任务

以下是我的代码示例:

Imports System.Threading

Public Class Form1
    Dim a As New Process

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        a.StartInfo.FileName = "C:\Program Files (x86)\CE\CE.exe"
        a.Start()
        AppActivate(a.Id)

        For i = 1 To CInt(txt.Text)
            DoTask()
        Next
    End Sub

    Private Sub DoTask()
        Thread.Sleep(1000)

        SendKeys.SendWait("^(N)")
        Thread.Sleep(500)
        SendKeys.SendWait("{ENTER}")
        Thread.Sleep(500)
        SendKeys.SendWait("new check")
        Thread.Sleep(500)
        SendKeys.SendWait("{ENTER}")

        Do While True
            'Here I want to wait until a message box pops up by the application
            'If message box displayed then exit do
        Loop

        SendKeys.SendWait("{ENTER}")
    End Sub
End Class
请帮我做这个。
谢谢你

我个人使用AutoIt来完成这类任务-有一个函数WinWaitActive,它会等待具有指定标题或类名的窗口打开并处于活动状态,然后你可以简单地向它发送击键

在VB中,我认为您必须这样做:等待具有指定标题或类名的窗口变为可见并激活

如果需要坚持使用VB,可以导入并使用AutoIt DLL:

AutoIt编辑器中有一个很好的工具,可以让您检查窗口及其子控件,并在脚本中使用类名。例如,我编写了等待SAP窗口中显示带有resultset的ALV网格的代码:

Func _WaitForALVGrid()
    Sleep(5000)
    _WinWaitActivate($windowName,"")
    Local $count = 0
    Do
        Sleep(5000) 
        $count = $count + 1
        $Text=ControlGetText("[CLASS:SAP_FRONTEND_SESSION]","","[CLASS:Afx:63DE0000:8:00010003:00000010:00000000]")
        if StringLeft($Text, 6) = "Nebyla" Then Return False 
        if $count>360 Then Return False
    Until StringInStr(WinGetClassList($windowName), "SapALVGrid")>0
    _WinWaitActivate($windowName,"")
    Sleep(5000)
    Return True
EndFunc
编辑: VB.NET中还有一个不使用AutoIT的方法-类似于WinWaitActivate:

类程序
_
私有共享函数FindWindow(类名为[String],WindowName为[String])为整数
端函数
_
私有共享函数SetForegroundWindow(hWnd为整数)为IntPtr
端函数
专用共享Sub-Main(参数为字符串())
“*********************************你要找的代码?
'使用正确的窗口标题(例如记事本)查找窗口
Dim hWnd为整数=0
而hWnd=0
线程。睡眠(1000)
hWnd=FindWindow(无“无标题-记事本”)
结束时
'如果找到,请激活它
SetForegroundWindow(hWnd)
“*********************************你要找的代码?
端接头
末级
另一个很好的例子是:


为什么这个标签是C#?C#解决方案也可以接受吗?是的,可以接受,这就是为什么。不客气。这种类型的编程是每一个合理的程序员都试图避免的,但有时没有其他方法——公司政策、封闭源代码等等。你是对的。从我的测试来看,我仍然对性能有一些担心,似乎不可能让我的程序不担心出错就工作,除非在执行过程中没有用户在pc上执行任何操作!
Class Program
    <DllImportAttribute("User32.dll")> _
    Private Shared Function FindWindow(ClassName As [String], WindowName As [String]) As Integer
    End Function
    <DllImportAttribute("User32.dll")> _
    Private Shared Function SetForegroundWindow(hWnd As Integer) As IntPtr
    End Function
    Private Shared Sub Main(args As String())
        '**************************** CODE YOU SEEK?
        'Find the window, using the CORRECT Window Title, for example, Notepad            
        Dim hWnd As Integer = 0
        While hWnd = 0
            Thread.Sleep(1000)
            hWnd = FindWindow(Nothing, "Untitled - Notepad") 
        End While
        'If found activate it
        SetForegroundWindow(hWnd)
        '**************************** CODE YOU SEEK?
    End Sub
End Class