.net 软件自动化
.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
在代码中引用包:
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;
}