C#之鼠标模拟技术

游戏程序的操作不外乎两种——键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合FindWindow和FindWindowEx寻找到窗体的按钮,在通过SetCursorPos或mouse_event函数操作鼠标,同时涉及到通过spy++工具获取窗体消息的信息.

鼠标自动点击按钮和查看鼠标运行轨迹:

首先创建一个C#工程,设计的窗体如下图所示,同时添加Timer时间器控件:

然后添加的如下代码,即可实现鼠标模拟技术及自动操作鼠标:

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按钮,其运行结果如下图所示:

原文地址:http://www.2cto.com/kf/201410/343342.html

时间: 2024-10-27 04:36:48

C#之鼠标模拟技术的相关文章

C# 系统应用之鼠标模拟技术及自动操作鼠标

游戏程序的操作不外乎两种--键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合FindWindow和FindWindowEx寻找到窗体的按钮,在通过SetCursorPos或mouse_event函数操作鼠标,同时涉及到通过spy++工具获取窗体消息的信息. 一. Windows API函数介绍 .NET没有提供改变鼠标指针位置.模拟单机操作的函数,但是可以通过调用Windows

[转]C# 系统应用之鼠标模拟技术及自动操作鼠标

原文网址: C# 系统应用之鼠标模拟技术及自动操作鼠标        游戏程序的操作不外乎两种——键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合FindWindow和FindWindowEx寻找到窗体的按钮,在通过SetCursorPos或mouse_event函数操作鼠标,同时涉及到通过spy++工具获取窗体消息的信息. 一. Windows API函数介绍 .NET没有提

【转载】游戏外挂的编写原理和思路

原文:游戏外挂的编写原理和思路 游戏外挂的编写原理(一) 一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将.虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧. 不管游戏外挂程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这些小小程序中使用了许多高端技术,如拦截Sock技术.拦截API技术.模拟键盘与鼠标技术.

《C#网络编程高级篇之网页游戏辅助程序设计(扫描版)》

<C#网络编程高级篇之网页游戏辅助程序设计>通过编写C#网络编程语言中具有代表性的实例,向读者深入细致地讲解了如何利用C#语言进行网页游戏辅助程序设计.本书通过大量的代码引导读者一步步学习和掌握C#的网络应用编程的方法和网页游戏辅助程序的设计技术. <C#网络编程高级篇之网页游戏辅助程序设计>涉及的领域包括多线程编程技术.socket套接字编程.tcp协议编程.http协议编程.远程控制技术.木马技术.模拟键盘和鼠标技术.网页游戏辅助程序设计技术等. <C#网络编程高级篇之网

游戏外挂教程(转)

游戏外挂教程(转) 由于本人是游戏爱好者,又是懒人,所以就有了写外挂的想法. 有同样爱好的人 可以 参考一下 主要是调用API的一些东西. 以下教程来自网上,本人通过一下教程,编写了魔兽争霸3,辅助工具(主用功能显血.改键) 谢谢 O(∩_∩)O~ 游戏外挂的编写原理(一)     一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游 戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将.虽然,现在对游戏外挂程序的“合法”

模拟鼠标键盘操作,含硬件模拟技术[转载]

键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件.那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制.    当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机.如

[转]鼠标和键盘模拟API

几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠标,就可以使角色畅游天下. 那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢.其实实现这个并不难,仅仅几个Windows API函数就 可以搞定,让我们先来认识认识这些API函数. (1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作. VOID mouse_event(DWORD dwFlags, // 鼠标动作标识.DWORD dx, // 鼠标水平方向位置.DWORD dy,

鼠标悬停图片移动的效果

当前很多购物网站,像京东,蘑菇街这些都有对展示的图片做这种鼠标悬停图片上移,下移,左移或者右移效果, 实现代码很简单,就用css3的transform便可实现. 下列代码实现的是鼠标悬停,div向上移动30px,鼠标拿开div恢复原始位置. css: <style> div{ margin-top: 100px; width: 100px; height: 100px; background: pink; transition:All 0.4s ease-in-out;//让移动效果变得平滑自

更换鼠标垫(鼠标)的心路历程

先给我自己的结论吧, 列个提纲, 有心情的话, 去写. 结论: 感觉无线的鼠标还是好, 但是要想鼠标顺滑的话, 需要鼠标脚垫与鼠标垫的共同配合. 金属鼠标垫虽然好用, 夏天也不错, 但磨损脚垫厉害, 所以反而不顺滑了. 如果可以更换脚垫, 那自然是极好的, 并且用个平常的布的鼠标垫就可以了. 桌子如果不输入的话, 入手一个 50 * 100 的鼠标垫吧. 会感觉很舒服, 不会再咯到胳膊了. 先列一个提纲吧. 换了好多鼠标, 鼠标垫, 还有键盘. 似乎是对外设有些追求. 不过目前就是笔记本(mac