2010-07-26 140 views
1

我必须自动化一个不受我控制的程序。我这样做的方式是将SendKeys.SendWait("keys")用于其他程序。问题是,有多个字段可能是活动的,无法自信地选择一个字段。这些字段都是不同的长度,所以我的解决方案是复制一些真正长的东西,将其复制到剪贴板,并查看最后一个字符,因此我知道在另一个程序中选择了哪个字段。不幸的是,这会覆盖剪贴板。如何复制,擦除,然后粘贴回剪贴板?

所以,我需要做这些事情。

  1. 将剪贴板内容(可能是任何东西)复制到变量中。
  2. 发送一堆东西到其他程序并复制它。然后用它来做其他事情。
  3. 将第一个变量复制回剪贴板。

理想情况下,它将能够从剪贴板(图像,文本,富文本)复制任何内容并将其放回,就像没有任何事情发生一样。这是我到目前为止的内容,但是它会擦除剪贴板中的任何内容,或者将其替换为无法粘贴到记事本中的特殊内容。

AppActivate("OtherProgram") 
Dim oldClipboard As IDataObject = Clipboard.GetDataObject 
//'Type long stuff, select all, cut to clipboard 
SendKeys.SendWait("{ESC}{F3}1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "+{HOME}^x") 
Dim selectedFieldText As String = Clipboard.GetText 
Dim lastChar As String = selectedFieldText.Substring(selectedFieldText.Length - 1, 1) 
Select Case lastChar 
    Case "4" 
     //'do nothing. We're in the correct field. 
    Case "J" 
     SendKeys.SendWait("+{TAB}") 
    Case "O" 
     SendKeys.SendWait("+{TAB}+{TAB}") 
    //'...and so on 
End Select 
//'Send data to the correct field in "OtherProgram" 
Clipboard.SetDataObject(oldClipboard) 

回答

2

如果你还没有在这个项目上做过多的编码,我强烈推荐AutoIt

它是为现有程序的自动化而构建的编程语言。由于您使用的是vb.net,因此它具有熟悉的BASIC语法。

它将单击按钮,处理剪贴板并生成本机可执行文件。

建造漂亮的guis很容易。它成熟,稳定,免费!

真的,请你帮个忙,check it out

+0

AutoIt/AutoHotKey是我的计划“B”。如果我无法顺利解决问题,我会使用其中的一个。可以使用命令行参数启动编译的AutoIt脚本吗? – Grant 2010-07-26 20:44:27

+1

@Grant,是的。 http://www.autoitscript.com/autoit3/docs/intro/running.htm#CommandLine – 2010-07-26 22:38:54

+0

所以,我实际上并没有使用AutoIt这个程序,但事实证明,您可以直接链接AutoItX3.dll文件并直接使用它在节目中。 VB.NET中的autoit.WinActive(“其他程序”)就像WinActive(“Other Program”)脚本一样。便利。 – Grant 2010-07-29 15:11:21

1

UI自动化名称空间可能包含适合您的解决方案。我会针对对象进行测试,因为不是所有东西都符合,但几乎所有东西都符合自动化。文本自动化有能力查看长度。 http://msdn.microsoft.com/en-us/library/system.windows.automation.textpattern.getselection.aspx也可以使用UI Spy.exe http://msdn.microsoft.com/en-us/library/ms727247.aspx查看如何使用UI自动化进行交互的表单布局。

好运。

+0

最近我可以告诉,这要求.Net多于2.0,这是我仅限于必须在Windows 2000上工作的限制。虽然看起来很酷。 – Grant 2010-07-29 15:09:50

+0

还有一个非托管版本。 – John 2010-07-29 15:18:57