我正在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}")
答案 0 :(得分:1)
我有此解决方案:
确定对话框是否已打开(如果存在),然后执行SendKeys。如果没有,请稍等片刻,也许3秒钟,然后再次检测。
操作方法:
确定对话框是否已打开
使用FindWindow查找对话框
等待一段时间,然后执行下一步
使用计时器来计算等待时间
回复: 我没有50个声誉,因此不允许发表评论。
要使用FindWindow,必须使用正确的参数。您可以使用Spy ++(Visual Studio,Tools / Spy ++)查找此对话框窗口的参数。
您可以使用下面的代码:
声明:
<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 ++查找对话框的“标题”和“类”的值。
在上面的示例中,窗口的标题的值为“添加到存档” 并且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}")