Problem Background
我正在更新C#中一个常用的工具,它要求脚本必须能够自动执行某些功能(点击按钮,填充文本字段) . 到目前为止,这已经使用 SendKeys
和 Alt
快捷方式完成 .
但是,这种方法似乎存在各种问题 .
编写脚本时大写的错误可能会导致问题 . 如果用户位于不同的选项卡控件上,则在选项卡控件上表单元素的快捷方式不起作用 .
Solution Requirements
我需要脚本(现在只是VBScript,但理想的解决方案适用于各种脚本语言)能够可靠地实现以下目标 -
-
单击
Button
s -
单击
ToolStripMenuItem
-
修改
TextBox
的值 -
递增
NumericUpDown
控件的值
Previous (Unacceptable) Solution
到目前为止,为了实现前三个,在C#应用程序中创建了Alt键盘快捷键,并且已经在VBS中使用 SendKeys
来激活它们 . 这已经相当不错,但不可靠(如上所述) .
这是一个示例脚本,它将焦点设置到应用程序,使用Alt快捷键选择注释字段,然后使用"My Comment"填充它,然后将焦点设置回调用脚本的应用程序 .
dim ObjShell
set objShell = WScript.CreateObject("WScript.Shell")
objShell.AppActivate "MyApplication"
objShell.SendKeys("%{C}")
objShell.SendKeys("{END}")
objShell.SendKeys("My Comment")
objShell.AppActivate "CallingApplication"
set objShell = Nothing
为了做后者,我创建了'invisible'按钮,当'clicked'(使用另一个Alt快捷键)时,增加 NumericUpDown
的值 . 显然这是一种非常非常糟糕的方法,因为用户可能会意外地点击这些按钮(更不用说它是多么笨拙,笨拙的解决方法!) .
我相信一定有更好的方法,但到目前为止,我找不到运气......
说清楚 -
-
我完全可以控制C#应用程序
-
我完全可以控制脚本
-
我只能控制调用脚本的应用程序,以便我可以确定它运行的脚本
1 回答
VBScript(和其他脚本工具)可以实例化COM可见对象 .
因此,在解决方案中创建一个新项目并将其标记为COM可见 . Walkthrough: Creating a simple component in C#
将一个类(即MyAppController或某个此类名称)添加到项目中,以便脚本创建和交互 .
使用定义良好的公共方法将用于控制和更新应用程序的逻辑放置在MyAppController类中 .
示例脚本
要使MyAppController类与您的应用程序通信,您需要设置一个简单的进程间通信链接 . 像命名管道之类的东西可以很好地运行MSDN:How to: Use Named Pipes for Interprocess Communication
这应该简化您的脚本并使通信更加健壮 . 例如,无需来回交换活动进程来更新注释 .