打开对话框后如何执行vb sendkeys.sendwait

时间:2018-10-25 01:01:13

标签: vb.net

我正在ArcMap中测试一个插件来打开现有文件,该程序在对话框打开后停止,似乎在对话框之前已经执行了SendKeys。非常感谢您的建议。

    Dim pCmdItmOpen As ICommandItem 'file open dialog
    Dim pUIDopn As New UID
    pUIDopn.Value = "{119591DB-0255-11D2-8D20-080009EE4E51}"
    pUIDopn.SubType = 2
    pCmdItmOpen = mxApp.Document.CommandBars.Find(pUIDopn)
    pCmdItmOpen.Execute()
    SendKeys.SendWait("C:\TEST.mxd")
    SendKeys.SendWait("{TAB 3}")
    SendKeys.SendWait("{ENTER}")

2 个答案:

答案 0 :(得分:1)

我有此解决方案:

确定对话框是否已打开(如果存在),然后执行SendKeys。如果没有,请稍等片刻,也许3秒钟,然后再次检测。

操作方法:

确定对话框是否已打开

FindWindow FindWindowEx

使用FindWindow查找对话框

等待一段时间,然后执行下一步

Using timers in vb

使用计时器来计算等待时间

回复: 我没有50个声誉,因此不允许发表评论。

要使用FindWindow,必须使用正确的参数。您可以使用Spy ++(Visual Studio,Tools / Spy ++)查找此对话框窗口的参数。

enter image description here

您可以使用下面的代码:

声明:

<DllImport("user32.dll", CharSet:=CharSet.Auto, EntryPoint:="FindWindow")>
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 
End Function

函数catchDialog:

Private Sub catchDialog()
     Dim hwnd As IntPtr = FindWindow("Class", "Caption")
     If hwnd <> IntPtr.Zero Then

        yourSendKeyProcess(hwnd)

     Else

     ' dialog not showing, waiting for 3 Sec. then detecting again. 
     ' Use Thread.Sleep() is simple then timer.
        Thread.Sleep(3000)
        catchDialog()

     End if

End Sub     

功能yourSendKeyProcess:

Private Sub yourSendKeyProcess(ByVal window as IntPtr)

     SetForegroundWindow(window)
     SendKeys.SendWait("C:\TEST.mxd")
     SendKeys.SendWait("{TAB 3}")
     SendKeys.SendWait("{ENTER}")

End Sub    

使用Spy ++查找对话框的“标题”和“类”的值。

enter image description here

在上面的示例中,窗口的标题的值为“添加到存档” 并且Class的值为“#32770(Dialog)”,代码为:

Dim hWnd As IntPtr = FindWindow("#32770", "Add to Archive")

但是即使您可以捕获对话框窗口,我也不知道您的代码SendKey是否可以正常工作,所以为什么要使用这些代码?

SendKeys.SendWait("C:\TEST.mxd")
SendKeys.SendWait("{TAB 3}")
SendKeys.SendWait("{ENTER}")

您要在对话框的文本框中输入字符串(“ C:\ TEST.mxd”),然后按对话框上的按钮吗?

编辑: 始终将form1设置在顶部,但不影响其他窗口上的操作: 添加此子项以将form1放在开头的顶部:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.TopMost = True
End Sub

和函数catchDialog:

Private Sub catchDialog()
     Dim hwnd As IntPtr = FindWindow("Class", "Caption")
     If hwnd <> IntPtr.Zero Then


        me.TopMost = false
        yourSendKeyProcess(hwnd)

     Else

     ' dialog not showing, waiting for 3 Sec. then detecting again. 
     ' Use Thread.Sleep() is simple then timer.
        Thread.Sleep(3000)
        catchDialog()

     End if

End Sub     

和功能yourSendKeyProcess:

Private Sub yourSendKeyProcess(ByVal window as IntPtr)

     SetForegroundWindow(window)
     SendKeys.SendWait("C:\TEST.mxd")
     SendKeys.SendWait("{TAB 3}")
     SendKeys.SendWait("{ENTER}")
     me.TopMost = true

End Sub

答案 1 :(得分:0)

感谢您的建议。我已经尝试过下面的代码,但是hWnd返回0。似乎FindWindow函数中的窗口名称参数“ Open”不起作用?

它可以在ArcMap中运行vba使用“ SendKeys”和“ Doevents”可以完美地完成所有工作,并且易于在ArcMap中进行调试。现在,我将vba转换为vb.net,发现它比我想象的要困难!!

“ SendKeys.SendWait”等待对话框关闭,然后继续。如果我使用“ SendKeys.Send”,则出现错误“ SendKeys.Send无法在此应用程序内运行...”。

    Dim pCmdItmOpen As ICommandItem 'file open dialog
    Dim pUIDopn As New UID
    pUIDopn.Value = "{119591DB-0255-11D2-8D20-080009EE4E51}"
    pUIDopn.SubType = 2
    pCmdItmOpen = mxApp.Document.CommandBars.Find(pUIDopn)
    pCmdItmOpen.Execute()
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim hWnd As IntPtr = FindWindow("Open", Nothing)
    MsgBox(hWnd)
    If hWnd.Equals(IntPtr.Zero) Then
        Return
    End If
    SetForegroundWindow(hWnd)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    SendKeys.SendWait("C:\TEST.mxd")
    SendKeys.SendWait("{TAB 3}")
    SendKeys.SendWait("{ENTER}")