文章目录

  • 往期内容回顾
  • 一、程序界面
  • 二、功能说明
    • 1.程序已经集成了Microsoft Spy++的功能
    • 2.通过拖动工具自动获取窗体的Title
    • 3.拖动工具自动获取鼠标准备单击点的坐标
    • 4.通过时间设置单击事件后等待时间(刷视频必备)
    • 5.浏览器应用程序不再局限于FireFox
    • 6.适应性增加,只要是通过鼠标单击完成的操作都可以交给它。
    • 7.对窗体程序的自动化单击也适用
  • 三、程序使用步骤
    • 1.程序运行后单击【获取浏览器标题:】,将出现工具如下:
    • 2.拖动放大镜工具到对应的程序窗体,将自动获取到窗体标题
    • 3.单击【获取坐标】按钮,将出现工具如下:
    • 4.拖动放大镜工具到需要自动单击的第一个点,松开,将弹出如下窗口:
    • 5.循环3和4的操作,可以得到一系列的坐标点和相应停顿时间
    • 6.全部设置完成后,直接单击【Start】按钮启动自动化操作。
    • 7.注意,这个自动化操作将周而复始的进行,可以直接关闭这个程序来关闭这个自动化操作。也可以单击【保存坐标】会把坐标点和时间保存到文件中,重新启动时会自动加载已经存在的坐标点和时间。
  • 三、程序关键代码
    • 1.API引用及成员变量
    • 2.移动鼠标代码
    • 3.Start事件代码
    • 4.定时器事件代码
    • 5.启动浏览器事件代码
  • 总结

往期内容回顾

前面已经写过两篇相关的博客了:
1.C#制作网站挂机程序:
(https://blog.csdn.net/stwzx/article/details/121042382)
2.Python构建自动在线刷视频—一个只能做不能说的项目:
(https://blog.csdn.net/stwzx/article/details/121519322)
3.【C#制作挂机程序V2.0—刷鼠标单击类在线视频程序】下载地址:
(https://download.csdn.net/download/stwzx/74089052)
第一篇文章主要在教大家怎样用C#来做一个挂机程序,代码也相对简朴,主要是完成了一个简单的功能,可以处理网页中的弹出的alert对话框。第二篇文章采用Python语言,完全控制浏览器,并能抓取网页中的Tag、id、name或者CSS等标记并进行键盘、鼠标输入,应该是比较完美的程序。但今天为什么又再次回到C#开发的老路上走自动化键盘、鼠标单击事件的挂机程序呢?Python不香吗?代码君不禁呵呵了,Python的坑不可谓不多啊,反爬技术直接让Python驱动浏览器bye bye了。


还是直接上干货吧

一、程序界面


程序还挺简洁的,不过不要小看它,功能可不小!

二、功能说明

1.程序已经集成了Microsoft Spy++的功能

2.通过拖动工具自动获取窗体的Title

3.拖动工具自动获取鼠标准备单击点的坐标

4.通过时间设置单击事件后等待时间(刷视频必备)

5.浏览器应用程序不再局限于FireFox

6.适应性增加,只要是通过鼠标单击完成的操作都可以交给它。

7.对窗体程序的自动化单击也适用

强调一下,拖动工具得到坐标和窗体标题的做法,在C#开发中的实现,有可能仅此一家哦。因为本码农搜遍百度都没找到,有此功能的都是C++开发的。所以这个创意在C#应用完全是本人独有。

三、程序使用步骤

核心使用功能展示:

1.程序运行后单击【获取浏览器标题:】,将出现工具如下:

2.拖动放大镜工具到对应的程序窗体,将自动获取到窗体标题

这个功能主要目的还是为了获取到应用程序的句柄,有了句柄可以把窗体设置为最上层显示。(不被其它窗体遮盖)

3.单击【获取坐标】按钮,将出现工具如下:

4.拖动放大镜工具到需要自动单击的第一个点,松开,将弹出如下窗口:


坐标不用设置,就是刚才鼠标松开的位置,停顿时间是单击后停多少时间,进行下一个操作的时间。

5.循环3和4的操作,可以得到一系列的坐标点和相应停顿时间

6.全部设置完成后,直接单击【Start】按钮启动自动化操作。

7.注意,这个自动化操作将周而复始的进行,可以直接关闭这个程序来关闭这个自动化操作。也可以单击【保存坐标】会把坐标点和时间保存到文件中,重新启动时会自动加载已经存在的坐标点和时间。

三、程序关键代码

1.API引用及成员变量

 #region API及成员变量/// <summary>/// 根据坐标获取窗口句柄/// </summary>/// <param name="point">坐标</param>/// <returns></returns>[DllImport("user32.dll")]private static extern IntPtr WindowFromPoint(Point point);public delegate bool EnumChildWindow(IntPtr WindowHandle, string num);/// <summary>/// 传递消息给记事本/// </summary>/// <param name="hWnd"></param>/// <param name="Msg"></param>/// <param name="wParam"></param>/// <param name="lParam"></param>/// <returns></returns>[DllImport("User32.DLL")]public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, string lParam);[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);[DllImport("user32.dll")]public static extern bool SetForegroundWindow(int hWnd);[DllImport("User32.dll")]public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name);[DllImport("User32.dll")]public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size);[DllImport("user32.dll")]public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size);[DllImport("user32")]private static extern int GetWindowThreadProcessId(IntPtr handle, out int pid);[DllImport("user32")]public static extern IntPtr SetActiveWindow(IntPtr hWnd);[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);[DllImport("user32.dll", EntryPoint = "FindWindow")]private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);//查找窗体控件public int iSecond = 30;public delegate bool CallBack(int hwnd, int lParam);public RECT rectMain = new RECT();private string typeName;private IntPtr mainHwnd;public IntPtr ip;private string BSType = "Chrome_WidgetWin_1";bool Flag = false;int X;int Y;int times;private IntPtr mainWindowHandle;[StructLayout(LayoutKind.Sequential)]public struct RECT{public int X; //最左坐标public int Y; //最上坐标public int Height; //最右坐标public int Width; //最下坐标}/// <summary>/// 查找句柄/// </summary>/// <param name="hwndParent"></param>/// <param name="hwndChildAfter"></param>/// <param name="lpszClass"></param>/// <param name="lpszWindow"></param>/// <returns></returns>[DllImport("User32.DLL")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);[DllImport("User32")]public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);[DllImport("user32.dll")]static extern bool SetCursorPos(int X, int Y);public const uint WM_SETTEXT = 0x000C;public System.Diagnostics.Process Proc;public System.Windows.Forms.Timer myTimer;public List<Opt> optList = new List<Opt>();public Queue<Opt> optQueue = new Queue<Opt>();#endregion

2.移动鼠标代码

public void MoveTo(int x1, int y1, int x2, int y2)
{float k = (float)(y2 - y1) / (float)(x2 - x1);float b = y2 - k * x2;for (int x = x2; x != x1; x = x + Math.Sign(x1 - x2)){//MoveTo(x1,y1,x,(k*x+b));SetCursorPos(x, (int)(k * x + b));Thread.Sleep(3);}
}

代码如下(示例):

3.Start事件代码

private void btnStart_Click(object sender, EventArgs e)
{foreach (string strLine in richTextBox1.Lines){string[] strInt = strLine.Split(new string[] { "," }, StringSplitOptions.None);if (strInt.Length <= 2)//小于2个参数:一个Point由X,Y组成{continue;}int x = int.Parse(strInt[0]);int y = int.Parse(strInt[1]);int times = int.Parse(strInt[2]);optList.Add(new Opt(x, y, times));}foreach (Opt opt in optList){optQueue.Enqueue(opt);}IntPtr hnd = FindWindow(null, txtTitle.Text);IntPtr ip = hnd;lblMessage.Text = ip.ToString();iSecond = 1;//myTimer.Interval = 1000 * iSecond;myTimer.Interval = 1000 * 60 * iSecond;myTimer.Enabled = false;FindWindowClass.TopMostWindow.SetTopomost(ip);SetForegroundWindow((int)ip);if (optQueue.Count > 0){Opt opt = optQueue.Dequeue();X = opt.x;Y = opt.y;times = opt.Times;System.Timers.Timer t = new System.Timers.Timer();//实例化 t.Elapsed += new System.Timers.ElapsedEventHandler(CallBack2);t.AutoReset = false;t.Interval = 1000 * times;t.Enabled = true;}
}

4.定时器事件代码

private void CallBack2(object sender, EventArgs e)
{MoveTo(X, Y, MousePosition.X, MousePosition.Y);mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), X, Y, 0, IntPtr.Zero);//Thread.Sleep(200);mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), X, Y, 0, IntPtr.Zero);if (optQueue.Count > 0){Opt opt = optQueue.Dequeue();X = opt.x;Y = opt.y;times = opt.Times;System.Timers.Timer t = new System.Timers.Timer();//实例化 t.Elapsed += new System.Timers.ElapsedEventHandler(CallBack2);t.AutoReset = false;t.Interval = 1000 * times;t.Enabled = true;}else{foreach (Opt opt1 in optList){optQueue.Enqueue(opt1);}Opt opt = optQueue.Dequeue();X = opt.x;Y = opt.y;times = opt.Times;System.Timers.Timer t = new System.Timers.Timer();//实例化 t.Elapsed += new System.Timers.ElapsedEventHandler(CallBack2);t.AutoReset = false;t.Interval = 1000 * times;t.Enabled = true;}
}

5.启动浏览器事件代码

private void btnStartBrowser_Click(object sender, EventArgs e)
{if (string.IsNullOrEmpty(txtFile.Text)) return;try{// 浏览器程序启动线程Proc = new System.Diagnostics.Process();Proc.StartInfo.FileName = txtFile.Text;Proc.StartInfo.Arguments = txtNetAddr.Text;  //浏览器打开URL参数Proc.StartInfo.UseShellExecute = false;Proc.StartInfo.RedirectStandardInput = true;Proc.StartInfo.RedirectStandardOutput = true;Proc.Start();}catch{Proc = null;}
}

总结

挂机程序的开发本身是存在着局限性的。往往只能针对某一个或某一类应用程序。但只要你注重思考和挖掘,不管什么样的应用程序,总能找到对应的点开发出相应的挂机程序。要想用一个挂机程序一招吃遍天下是不可行的。

C#制作挂机程序V2.0—刷鼠标单击类在线视频相关推荐

  1. 小月域名防红程序 V2.0最新版本

    介绍: PHP源码_小月域名防红程序V2.0最新版本 网盘下载地址: https://zijiewangpan.com/8872KClCF20 图片:

  2. 手机自动化测试工具Auto.js学习使用(附一个自动刷抖音类短视频的demo)

    Auto.js学习使用 介绍 使用 1. 手机端安装auto.js 2.电脑下载vscode,安装插件 3.手机打开远程开发功能 4. vscode连接手机 5.进行开发(一个自动刷抖音类短视频的de ...

  3. 蚂蚁帮路由器Antbang A3s V2.0刷入OpenWrt/LEDE

    参考资料 路由器基本常识_冰色阳光的博客-CSDN博客_路由器bootloader是什么 https://www.right.com.cn/forum/thread-3191610-1-1.html ...

  4. 快车蜘蛛池站群程序 v2.0

    源码下载:快车蜘蛛池站群程序v2.0-小程序文档类资源-CSDN下载 [首发]快车蜘蛛池站群程序源码 v2.0 无需数据库独立运行 支持泛解析模式 程序介绍: 1 程序带有简易后台 2 文章内容可以自 ...

  5. php编写蜘蛛池站群教程,快车蜘蛛池站群程序 v2.0

    快车蜘蛛池站群程序程序特点 无需数据库独立运行 支持泛解析模式 1 程序带有简易后台 2 文章内容可以自动采集 或者自动组合生成 3 程序伪静态 动态可一键开关 4 内置近50套模版 可随机调用,也可 ...

  6. php微擎万能门店小程序_万能门店独立版小程序V2.0.2,基于ThinkPHP5框架开发的万能门店小程序源码...

    源码介绍 基于ThinkPHP5框架开发的万能门店小程序源码,是微擎上很火的万能门店小程序的独立版,万能门店小程序DIY建站无限独立版非微擎应用,独立版是基于国内很火的ThinkPHP5.0.10框架 ...

  7. 抽奖活动小程序v2.0

    抽奖活动小程序开奖逻辑简析 ~ 今天是我的抽奖活动小程序第一个活动开奖的日子,我分享下具体的开奖逻辑,对我而言这是一种回顾,更是一种技术复盘,通过本次复盘,希望可以发现目前需要优化的逻辑. 本次开奖核 ...

  8. 自助点餐php,餐饮类小程序:微信自助点餐小程序v2.0.12_开源完整版前后端源码_已测试...

    上次转错900给陌生人,在无数次央求交还自己时,对方都没有回复,就在我失望的时分,对方回复了,你死心吧!我是不会还你一毛钱的!我顿时火冒三丈,准备破口大骂,谁知对方转来899.9元,瞬间把我感动的,他 ...

  9. 【微课制作软件】Focusky教程 | 设置鼠标单击不进入下一页面

    在Focusky(也称为"FS软件")中, 您可以在"选项"中设置单击鼠标时演示不进入一下页面. 具体步骤如下: 依次单击"选项-展示设置" ...

最新文章

  1. mysql分类和事务回滚
  2. quartz定时定时任务执行两次
  3. Dataset之Rotten Tomatoes:Rotten Tomatoes影评数据集简介、下载、使用方法之详细攻略
  4. 【学习笔记】18、函数的其他功能
  5. go语言基础到提高(9)-go ide
  6. 20170626_oracle_数据库设计
  7. html图片加滚动文字,滚动文字、图片等html代码
  8. ubuntu18设置屏幕旋转_无线电对讲机,常用电台上中继台设置
  9. 人工智能ai以算法为基础_IT团队如何为AI项目奠定正确的基础
  10. 使用MurMurHash在Shodan平台上寻找钓鱼网站
  11. 字节高工强推 “Android学习视频教程631部,文末有链接哦”
  12. 计算机组成原理学习笔记-加法器
  13. java 响应式编程_响应式编程
  14. C#使用struct直接转换下位机数据的示例代码
  15. 苹果固件验证关闭服务器时间,苹果ios系统终于可以降级了,或关闭固件验证
  16. RabbitMQ3:RabbitMQ的使用方法
  17. 腾讯区块链团队首次换将,蔡弋戈将变动职务
  18. python生成word目录_Python 文件与目录操作方法总结
  19. 联想小新310-14isk笔记本内存条的等等事
  20. Android Key获取方式

热门文章

  1. 『C # 开发』技能 Get√ ——制作CMD界面的简单GIF图片
  2. C++ - 非类型模版参数和模版的特化
  3. python DEA:强/弱处置性假设下的考虑非期望产出的非径向距离函数
  4. strom学习总结——我从三个纬度开始:maven工程、徐明明博客和应用场景。
  5. 蓝桥杯软件比赛中的注意事项(C/C++)
  6. 左连接、右连接、内连接、全外连接的区别是什么?
  7. React与Koa一起打造一个仿稀土掘金全栈个人博客(技术篇)
  8. 大学重要证书排名和大学生应当常去的十大网
  9. idea 缩小 放大 字体 鼠标 滚动 ctrl 快捷键
  10. CAMP模型python实现