.net 软件自动化

发布时间 2024-01-09 15:25:19作者: Simian_2018_12_22

.net 开发软件辅助

使用杨中科开发的NetAutoGUI,杨中科视频教程:1-开发环境搭建_哔哩哔哩_bilibili

网页自动化可以学习:selenium

更多的应用程序自动化开发:win32 API

本文章项目地址:NetAutoWx: 使用.net 实现自动给微信好友发送消息,没有微信登录功能,电脑必须登录着微信。 (gitee.com)

1. 搭建开发环境

包名:NetAutoGUI NetAutoGUI.Windows

安装NuGet包:

NuGet\Install-Package NetAutoGUI -Version 1.0.9

NuGet\Install-Package NetAutoGUI.Windows -Version 1.0.9

如果安装失败则需要设置目标框架为windows
image

在代码中引用包:

using NetAutoGUI;

// 应用程序操作使用
GUI.Application
// 鼠标操作使用
GUI.Mouse
// 键盘操作使用
GUI.Keyboard
// 操作使用
GUI.MessageBox
// 操作使用
GUI.Screenshot

2. 应用程序操作

GUI.Application 接口内容:

public interface IApplicationController
{
  // 启动一个程序,appPath:程序地址 arguments:程序所需参数
  Process LaunchApplication(string appPath, string? arguments = null);
  // 根据进程名称判断程序是否正在运行
  bool IsApplicationRunning(string processName);
  // 根据进程名称结束进程
  void KillProcesses(string processName);
  // 
  Window[] GetAllWindows();
  // 根据窗口名称获取正在运行的窗口
  Window? FindWindowByTitle(string title);
  // 根据窗口的句柄获取正在运行的窗口
  Window FindWindowById(long id);
  // 
  Window? FindWindow(Func<Window, bool> predict);
  // 根据窗口名称(通配符)方式获取窗口
  Window? FindWindowLikeTitle(string wildcard);
  // 等待进程启动完成,默认等待2秒
  void WaitForApplication(string processName, double timeoutSeconds = 2.0);
  // 等待窗口出现然后根据窗口名称获取窗口,默认等待2秒
  Window WaitForWindowByTitle(string title, double timeoutSeconds = 2.0);
  // 
  Window WaitForWindow(Func<Window, bool> predict, double timeoutSeconds = 2.0);
  // 等待窗口出现然后根据窗口名称(通配符)方式获取窗口,默认等待2秒
  Window WaitForWindowLikeTitle(string wildcard, double timeoutSeconds = 2.0);
}

2.1 启动程序

// 打开系统进程
GUI.Application.LaunchApplication("notepad");
// 打开本地一个进程
GUI.Application.LaunchApplication("F:\\Notepad++\\notepad++.exe");

2.2 判断一个程序是否在运行中

if (GUI.Application.IsApplicationRunning("WeChat"))
{
    Console.WriteLine("已经运行");
}

2.3 根据程序名字结束进程

GUI.Application.KillProcesses("notepad");

2.4 根据窗口标题精确查找窗口

Window? win = GUI.Application.FindWindowByTitle("记事本");

2.5 根据窗口标题模糊查找窗口

Window? win = GUI.Application.FindWindowLikeTitle("*记事本*");

2.6 等待窗口出现然后根据窗口标题模糊查找窗口

Window win1 = GUI.Application.WaitForWindowLikeTitle("*新文件*",0.1);

3. window 对象操作

Window? win = GUI.Application.FindWindowLikeTitle("*记事本*");
if (win != null)
{
    // 激活窗口
    win.Activate();
    // 最大化
    win.Maximize();
    // 点击编辑-替换菜单
    //win.GetMainMenu().编辑.替换();
    // 移动鼠标到指定位置
    win.MoveMouseTo(200,300);
    // 双击鼠标左键
    win.DoubleClick(200,250);
    // 单机鼠标右键
    win.Click(button: MouseButtonType.Right);
    // 根据给定图像匹配然后点击
    win.WaitAndClick("icon.png");
    // 查找图像在窗口中的位置,并返回
    Rectangle? r = win.Locate("icon.png");
    if (r != null)
    {
        // 点击图像的中间位置
        win.Click(r.X + (r.Width / 2), r.Y + (r.Height/2));
    }
}

4. 键盘操作

键盘操作不会移动鼠标,鼠标焦点在哪里,键盘输入就在哪里。


  public interface IKeyboardController
  {
    // 输入字符
    void Write(char c);
    // 输入字符串
    void Write(string s);
	// 输入字符串,每个字符输入间隔时间
    void Write(string s, double interval);
	// 按下并抬起指定键
    void Press(params VirtualKeyCode[] keys);
	// 按下那个键但不抬起
    void KeyDown(VirtualKeyCode key);
	// 抬起那个键
    void KeyUp(VirtualKeyCode key);
	// 组合按键:按键顺序按下,再按相反顺序释放
    void HotKey(params VirtualKeyCode[] keys);

    IDisposable Hold(VirtualKeyCode key);
  }

4.1 输入字符串

GUI.Keyboard.Write("输入指定字符");

4.2 组合按键

GUI.Keyboard.HotKey(VirtualKeyCode.CONTROL,VirtualKeyCode.VK_V); // Ctrl + V

5. 鼠标操作

public interface IMouseController
{
  NetAutoGUI.Size Size();

  Location Position();

  bool OnScreen(int x, int y);
  // 移动鼠标到指定位置
  void MoveTo(int x, int y);
 
  void MoveTo(int x, int y, double durationInSeconds, TweeningType tweeningType = TweeningType.Linear);

  void Move(int offsetX, int offsetY);
  // 单击鼠标
  void Click(int? x = null, int? y = null, MouseButtonType button = MouseButtonType.Left, int clicks = 1, double interval = 0.0);
  // 双击鼠标
  void DoubleClick(int? x = null, int? y = null, MouseButtonType button = MouseButtonType.Left, double interval = 0.0);
  // 鼠标按下
  void MouseDown(int? x = null, int? y = null, MouseButtonType button = MouseButtonType.Left);
  // 鼠标释放
  void MouseUp(int? x = null, int? y = null, MouseButtonType button = MouseButtonType.Left);

  void Scroll(int value);
}

5.1 鼠标单击

这种方式指定的位置是相对于整个桌面的,window对象指定的位置是相对于窗口

GUI.Mouse.Click(100, 200);

6. 桌面操作

6.1 获取图片在桌面的坐标

Rectangle? rectangle = GUI.Screenshot.LocateOnScreen("wx.png");
if (rectangle != null)
{
    // 鼠标单击
    GUI.Mouse.Click(rectangle.X, rectangle.Y);
    win = GUI.Application.FindWindowLikeTitle("微信");
}
else
{
    Console.WriteLine("在系统托盘中没找到微信");
    return;
}