澳门美高梅手机网站C# 系统利用的鼠标模拟技术同机动操作鼠标

文章开始:本文是李明玉个人号发表给活壹佰的稿子(http://www.chanpin100.com/article/104291)转载文章就供大家读,不发其它商业用途。

一日游程序的操作不外乎两栽——键盘输入控制与鼠标输入控制,几乎有戏受还下鼠标来改角色的位置以及动向,本文主要是描述如何使用C#调用Windows
API函数实现鼠标模拟操作的功能.首先通过整合FindWindow和FindWindowEx寻找到窗体的按钮,在通过SetCursorPos或mouse_event函数操作鼠标,同时提到到经spy++工具得到窗体消息的信息.

“形状生成器”在组合或私分形状方面,是相当有优势的!很多时刻,它还能够了事爆路径查找器。

一. Windows API函数介绍

.NET没有提供反鼠标指针位置、模拟单机操作的函数,但是足以经过调用Windows
API函数实现.
[DllImport(“user32.dll”)]
static extern bool SetCursorPos(int X,int Y);
欠函数用于安装鼠标的岗位,其中X和Y是对立于屏幕左上角的绝对化位置.
[DllImport(“user32.dll”)]
static extern void mouse_event(MouseEventFlag flags,int dx,int dy,uint
data,UIntPtr extraInfo);
欠函数不仅可设置鼠标指针绝对位置,而且可以因相对坐标来设置位置.
内部flags标志位集,指定点击按钮和鼠标动作的多情况.dx指鼠标沿x轴绝对位置还是达软鼠标事件位置有以来移动的数量.dy指沿y轴的断位置要于上次鼠标事件来说移动的数量.data如果flags为MOUSE_WHEEL则该值指鼠标轮移动的多寡(否则为0),正值向前转动.extraInfo指定与鼠标事件有关的叠加32位值.
[DllImport(“user32.dll”)]
static extern IntPtr FindWindow(string strClass, string strWindow);
欠函数根据类名和窗口名来得到窗口句柄,但是是函数不可知查找子窗口,也未区分轻重缓急写.如果假定从一个窗口的子窗口查找需要用FIndWindowEX函数.
[DllImport(“user32.dll”)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr
hwndChildAfter,
string strClass, string strWindow);
欠函数获取一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配,该函数查找子窗口时从破在加的子窗口后面的生一个子窗口开始.其中参数
hwnParent为要查找子窗口的父窗口词柄,若该值为NULL则函数以桌面窗口也父窗口,查找桌面窗口的富有子窗口.
hwndChildAfter子窗口句柄,查找打以Z序中之下一个子窗口起,子窗口要为hwnParent直接子窗口设不裔窗口,若hwnChildAfter为NULL,查找打翁窗口的首先身长窗口开始.
strClass指为一个点名类名的拖欠了字符串或一个标识类名字符串的成员的指针.
strWindow指向一个指定窗口名(窗口标题)的亏欠了字符串.若为NULL则具有窗体全匹配.
返回值:如果函数成功,返回值为富有指定类名和窗口名之窗口句柄,如果函数失败,返回值为NULL.

说及矢量绘图软件而一定会想到illustrator!illustrator是Adobe公司出品的轻重级矢量软件,这款软件的绘图功能十分有力,尤其是以打造图标、绘制插图等方面都十分具有优势,是当今应用最广大的矢量创作图形软件之一。

二. 鼠标自动点击按钮和查看鼠标运行轨道

率先创建一个C#工程,设计的窗体如下图所出示,同时添加Timer时间器控件:
澳门美高梅手机网站 1
然后加上的如下代码,即可兑现鼠标模拟技术以及机关操作鼠标:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//引用新命名空间
using System.Runtime.InteropServices;  //StructLayout

namespace MouseAction
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //结构体布局 本机位置
        [StructLayout(LayoutKind.Sequential)]
        struct NativeRECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        //将枚举作为位域处理
        [Flags]
        enum MouseEventFlag : uint //设置鼠标动作的键值
        {
            Move = 0x0001,               //发生移动
            LeftDown = 0x0002,           //鼠标按下左键
            LeftUp = 0x0004,             //鼠标松开左键
            RightDown = 0x0008,          //鼠标按下右键
            RightUp = 0x0010,            //鼠标松开右键
            MiddleDown = 0x0020,         //鼠标按下中键
            MiddleUp = 0x0040,           //鼠标松开中键
            XDown = 0x0080,
            XUp = 0x0100,
            Wheel = 0x0800,              //鼠标轮被移动
            VirtualDesk = 0x4000,        //虚拟桌面
            Absolute = 0x8000
        }

        //设置鼠标位置
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int X, int Y);

        //设置鼠标按键和动作
        [DllImport("user32.dll")]
        static extern void mouse_event(MouseEventFlag flags, int dx, int dy,
            uint data, UIntPtr extraInfo); //UIntPtr指针多句柄类型

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string strClass, string strWindow);

        //该函数获取一个窗口句柄,该窗口雷鸣和窗口名与给定字符串匹配 hwnParent=Null从桌面窗口查找
        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
            string strClass, string strWindow);

        [DllImport("user32.dll")]
        static extern bool GetWindowRect(HandleRef hwnd, out NativeRECT rect);

        //定义变量
        const int AnimationCount = 80;         
        private Point endPosition;            
        private int count;

        private void button1_Click(object sender, EventArgs e)
        {
            NativeRECT rect;
            //获取主窗体句柄
            IntPtr ptrTaskbar = FindWindow("WindowsForms10.Window.8.app.0.2bf8098_r11_ad1", null);
            if (ptrTaskbar == IntPtr.Zero)
            {
                MessageBox.Show("No windows found!"); 
                return;
            }
            //获取窗体中"button1"按钮
            IntPtr ptrStartBtn = FindWindowEx(ptrTaskbar, IntPtr.Zero, null, "button1");
            if (ptrStartBtn == IntPtr.Zero)
            {
                MessageBox.Show("No button found!");
                return;
            }
            //获取窗体大小
            GetWindowRect(new HandleRef(this, ptrStartBtn), out rect);
            endPosition.X = (rect.left + rect.right) / 2;
            endPosition.Y = (rect.top + rect.bottom) / 2;
            //判断点击按钮
            if (checkBox1.Checked)
            {
                //选择"查看鼠标运行的轨迹"
                this.count = AnimationCount;
                movementTimer.Start();
            }
            else
            {
                SetCursorPos(endPosition.X, endPosition.Y);
                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                textBox1.Text = String.Format("{0},{1}", MousePosition.X, MousePosition.Y);
            }

        }

        //Tick:定时器,每当经过多少时间发生函数
        private void movementTimer_Tick(object sender, EventArgs e)
        {
            int stepx = (endPosition.X - MousePosition.X) / count;
            int stepy = (endPosition.Y - MousePosition.Y) / count;
            count--;
            if (count == 0)
            {
                movementTimer.Stop();
                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            }
            textBox1.Text = String.Format("{0},{1}", MousePosition.X, MousePosition.Y);
            mouse_event(MouseEventFlag.Move, stepx, stepy, 0, UIntPtr.Zero);
        }
    }
}

还要从定义一个会话框,增加一个button按钮,其运行结果如下图所示:
澳门美高梅手机网站 2
足见见当运行程序勾选”查看鼠标运行的轨迹”并点击”开始”按钮后,会经FindWindow和FindWindowEx函数查找窗体”Form1″的”button1″按钮,并透过mouse_event移动鼠标和点击鼠标.其中函数原型为:

IntPtr FindWindowEx(
    IntPtr hwndParent,     // handle to parent window [父窗体句柄]
    IntPtr hwndChildAfter, // handle to child window [子窗体句柄]
    string strClass,       // class name [窗体类名]
    string strWindow       // window name [窗体名]
);

但是如何找到窗体类名和按钮的类名呢?由于初学,很多窗体我还并未兑现而QQ,它需利用一个让spy++的工具.
PS:第一浅制造gif格式动态图表,参照博客
https://blog.csdn.net/tangcheng\_ok/article/details/8246792

矢量绘图软件辣么多,为神马illustrator能独立得设计师的“恩宠”呢?

三. 使用SPY++工具获得窗体信息

比方改动代码为:

//获取任务栏句柄
IntPtr ptrTaskbar = FindWindow("Shell_TrayWnd",null); 
//托盘通知句柄
IntPtr ptrStartBtn = FindWindowEx(ptrTaskbar, IntPtr.Zero, "TrayNotifyWnd", null);  

可取计算机底部任务栏的托盘通知句柄,其中经过Spy++工具(VS中”工具”中从带)查找如下图所示: 澳门美高梅手机网站 3
一致,我通过spy++工具获得txt句柄,首先打开spy++工具,同时点击”查找窗口”按钮(望远镜),再点击”查找程序工具”中按钮拖拽到使查看的窗体中,点击”确定”按钮. 澳门美高梅手机网站 4
诸如此类就见面显示这txt的信,同时可以右击”属性”显示窗体的类名、窗体题目、句柄等信息.
澳门美高梅手机网站 5
末了经过下面代码可以获hello.txt的词柄:

//获取记事本句柄
IntPtr ptrTaskbar = FindWindow("Notepad", null);
IntPtr ptrStartBtn = FindWindowEx(ptrTaskbar, IntPtr.Zero, "Edit", null);

再通过mouse_event操作鼠标,同时可以经SendMessage将指定的音发送至一个要么多独窗口,PostMessage将一个音寄送及一个线程的音讯队列后即使即返回.实现消息传递等职能,学习ing~

今天,我们跟着李明玉先生,通过AI中之一个稍微器——形状生成器,来涨涨姿势。

四. 总结

该篇稿子要讲述C#如何操作鼠标的风波,在打游戏外挂或机关运行程序时特别实用,但遗憾的凡在地方通过窗体名称”Form1″获取窗体时连败,需要经过spy++获取她的类名来实现.Why?同时使想读键盘模拟技术的得研究SetWindowsHookEx(安装钩子)、CallNextHookEx(下一个钩子)、UnhookWindowsHookEx(卸载钩子)和鼠标Hook实现无数技术.
指望文章对大家所有帮助,如果来荒唐或不足之处,请见谅~
(By:Eastmount 2014年10月13日
晚上8点 https://blog.csdn.net/eastmount/)

参考资料-在线笔记:
本文主要参考书籍《C#纱成高级篇的网页打辅助程序设计》张慧斌
王小峰著
1.C#博QQ聊天输入框中内容 https://www.csharpwin.com/csharpspace/9133r5654.shtml

2.C#摸索窗口,FindWindow用法(By-LYBwwp)https://blog.csdn.net/lybwwp/article/details/8168553
3.FindWindowEx用法(By-coolszy) https://blog.csdn.net/coolszy/article/details/5523784
4.C#
隐藏任务栏开始按钮关闭shell(By-sshhbb)https://blog.csdn.net/sshhbb/article/details/6605976

5.任务栏句柄 https://blog.csdn.net/wangjieest/article/details/6943241
6.C#怎么样在表程序的密码框内自动输入密码 https://biancheng.dnbcw.info/c/117849.html
7.C#贯彻对表面程序的调用操作 https://www.blue1000.com/bkhtml/c17/2012-11/70993.htm
8.百度明亮 C# API函数FindWindowEx返回子窗体的价值吗零星
9.百度懂 用C#操作API落实填写桌面窗体内的textbox并点击窗体按钮

造型生成器

相生成器在重组要私分形状方面,是相当有优势的!很多上,它都能终止爆路径查找器。

口说无凭,有图有实质!下面通过我们在插画中常见的云朵效果也条例,来探望形状生成器到底能够做啊作用?

①咱们在AI中布置起结合是图所用的图。(如下图)

②根据你的需要判定来如何有凡待保留的,哪些有是索要给减去的。

③抉择好以后,按shift+M快捷键调出形状生成器。

每当默认状态下,界面是加选的效应。单时鼠标不放松手,就足以将需要联合及齐的情开展拖拽,此时会见拉发一致久黑线,黑线链接的一些即使是统一到手拉手的组成部分。

若果想使减选的言辞该肿么办?

止需要以住alt键不松劲手,把用去的局部点选就OK了。选择收,就足以博得我们想如果的功力。

大凡休是充分简单?是免是老大便宜?

敲黑板!重点来了。

形状生成器虽然使用方便,但当操作时也要在意少接触

①面与面/线与线/面与线交叉的机能,都可开展加减操作,不过肯定要是来交叉,产生交叉,产生交叉!(重要之作业说其三方方面面)才发效应。

②万一想生成形状所急需的水彩,可以在增选工具和图后,在拓展操作前先行确认好,这样可预防有的力量颜色及描边被禁用,发生看不显现之情景。

哼了,使用技术都叫受您了,赶紧操作起来,亲自感受下形状生成器的“魅力”吧!

文章最后:再次说明所有转载文章就供上,感谢李明玉先生的忘我分享。假设爱我们的章点关注**吧!比心呦!**

发表评论

电子邮件地址不会被公开。 必填项已用*标注