如何使用C#代码以编程方式单击运行应用程序中的按钮

我想写一个C#程序,它将启动一个.exe(这是一个简单的工作,我知道该怎么做。)但现在我想为它添加更多的function。 我想将用户输入传递给我的程序,并希望将它们作为输入传递给运行.exe。我还要单击exe窗口上可用的特定按钮。 重要的是,我想在没有用户知识的情况下以编程方式执行它,我们实际上在后台运行该exe。 如果有可能请告诉我。 这是非常紧急的。

是的,可以使用Windows API。 您需要向该窗口发送消息。 首先使用Spy ++获取要单击的所有按钮的ID。 Spy ++是一个Visual Studio工具,它会向您显示按下这些按钮时正在向应用程序发送的消息。 然后使用PostMessage()函数(Windows API)以编程方式发送相同的消息。

您还可以查看Winamp(Windows的音乐播放器),还有关于如何从外部应用程序按下其按钮的文档。 您可以以相同的方式为其他应用程序执行此操作,您只需要知道所有控件的ID以及Windows或其类的名称。

这是代码点击Winamp的暂停按钮:

#define AMP_PAUSE 40046 HWND hwnd = FindWindow("Winamp v1.x", 0); if(hwnd) SendMessage(hwnd, WM_COMMAND, AMP_PAUSE, 0); 

这是用C ++编写的。 如果您在C#中执行此操作,请使用PInvoke访问Windows API。 我假设你知道怎么做。 在第一步中,FindWindow获取窗口的句柄,它通过其类的名称来标识它。 然后我们使用SendMessage或PostMessage发送消息。 有四个参数:发送消息的窗口,消息ID和两个参数。

在Spy ++中,您可以找到FindWindow和SendMessage所需的参数。 请启动它并稍微玩一下,看它能做些什么。

如果它是WPF应用程序,您可以查看AutomationPeers

如果你想避免直接使用WIN API,那么有一个小型库可以帮助你解决这个问题, WindowScrape 。

您可以直接从C#中使用它。 一些function:

  • 搜索在内存中注册的窗口和子控件。
  • 更改窗口的标题
  • 更改UI元素的文本(权限/隐私允许)
  • 单击UI元素
  • 阅读窗户的标题
  • 从UI元素中读取文本
  • 浏览对象层次结构
  • 设置对象位置
  • 设置对象大小

可能还有其他类似的库,但此时这是我唯一知道的库。

编辑

样品用法:

 using System.Windows.Forms; //WindowScrape using WindowScrape.Types; namespace WindowsFormsTestApplication { public partial class Form1 : Form { public Form1() { InitializeComponent(); var npad = HwndObject.GetWindowByTitle("Untitled - Notepad"); } } }