转: C#控制鼠标点击,移动,滑轮滚动

本文介绍了一种使用C#模拟鼠标点击、移动及滑轮滚动的方法。通过调用user32.dll库中的mouse_event函数,实现了自动控制鼠标进行指定操作的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#控制鼠标点击,移动,滑轮滚动
2018年04月15日 23:41:57
阅读数:40
前不久无意中发现了一款手机上的软件,看新闻就可以得金币,通过金币可以换取RMB,怀着好奇,我下载了并且点击进去查看了,通过使用,发现这款软件获取金币的方法很简单,就是点击一篇新闻,进去后,隔一段时间滑动一下屏幕,大概20多秒就可以得到一次金币。当时我就在想有没有办法我自己写一个程序,模拟鼠标的点击,移动,滑轮滚动,然后把手机连接到电脑上,用电脑控制手机的屏幕(我是C#的,就只有这样转换了,要是Android的就直接写控制手机的了)。在上网查询了一些方法,结合自己写的。下面是鼠标点击,移动,滑轮滚动的方法。
[csharp] view plain copy
[DllImport(“user32.dll”)]
static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);

   const int MOUSEEVENTF_MOVE = 0x1;//模拟鼠标移动  
   const int MOUSEEVENTF_LEFTDOWN = 0x2;//  
   const int MOUSEEVENTF_LEFTUP = 0x4;  
   const int MOUSEEVENTF_RIGHTDOWN = 0x8;  
   const int MOUSEEVENTF_RIGHTUP = 0x10;  
   const int MOUSEEVENTF_MIDDLEDOWN = 0x20;  
   const int MOUSEEVENTF_MIDDLEUP = 0x40;  
   const int MOUSEEVENTF_WHEEL = 0x800;  
   const int MOUSEEVENTF_ABSOLUTE = 0x8000;  

[csharp] view plain copy
//控制鼠标移动到坐标((int_X + 100) * 65536 / 1366, (int_Y + move_long) * 65536 / 768)这个绝对位置上。1366和768是电脑屏幕的分辨率,我的电脑是1366*768的分辨率
/分辨率要根据自己的电脑设置正确,不然获取到的坐标不准确。
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, (int_X + 100) * 65536 / 1366, (int_Y + move_long) * 65536 / 768, 0, 0);
[csharp] view plain copy

[csharp] view plain copy
//鼠标在原地左键点击一次(点下和松开)
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
[csharp] view plain copy
//控制鼠标滑轮滚动,count代表滚动的值,负数代表向下,正数代表向上,如-100代表向下滚动100的y坐标
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, count, 0);

下面是我写的这个软件的

全部代码:
[csharp] view plain copy

[csharp] view plain copy
public Form1()
{
InitializeComponent();
}
private static int count = -100;//鼠标上下滚动的距离
private int state = 1;//记录鼠标是向上还是向下滚动
private int int_X;//鼠标点击的坐标的X
private int int_Y;//鼠标点击的坐标的Y
private int time=0;//记录执行的时间
private int move_long = 0;
private int settime = 0;
private int clickCount = 5;
private void Form1_Load(object sender, EventArgs e)
{
//每过100毫秒获取鼠标坐标,用于获取鼠标点击地方的坐标
timer2.Enabled = true;
timer2.Interval = 100;

    }  

    [DllImport("user32.dll")]  
    static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);  

    const int MOUSEEVENTF_MOVE = 0x1;//模拟鼠标移动  
    const int MOUSEEVENTF_LEFTDOWN = 0x2;//  
    const int MOUSEEVENTF_LEFTUP = 0x4;  
    const int MOUSEEVENTF_RIGHTDOWN = 0x8;  
    const int MOUSEEVENTF_RIGHTUP = 0x10;  
    const int MOUSEEVENTF_MIDDLEDOWN = 0x20;  
    const int MOUSEEVENTF_MIDDLEUP = 0x40;  
    const int MOUSEEVENTF_WHEEL = 0x800;  
    const int MOUSEEVENTF_ABSOLUTE = 0x8000;  




    //模拟鼠标滑动事件  
    private void timer1_Tick(object sender, EventArgs e)  
    {  
        time++;//事件执行次数  
        clickCount++;  
        txt_content.Text = clickCount.ToString();  
        if (clickCount < 4)  
        {  
            //控制鼠标移动到坐标((int_X + 100) * 65536 / 1366, (int_Y + move_long) * 65536 / 768)这个绝对位置上。1366和768是电脑屏幕的分辨率,我的电脑是1366*768的分辨率  
            //分辨率要根据自己的电脑设置正确,不然获取到的坐标不准确。  
            mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, (int_X + 100) * 65536 / 1366, (int_Y + move_long) * 65536 / 768, 0, 0);  
        }  
        if (clickCount == 4)  
        {  
            //鼠标在原地左键点击一次(点下和松开)  
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);  
            time = 1;  
            txt_content.Text = clickCount.ToString()+":点击事件";  
            return;  
        }  
        if (time % (settime / 3) == 0)  
        {  


            mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, int_X * 65536 / 1366, (int_Y) * 65536 / 768, 0, 0);  
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);  
            clickCount = 0;  
            time = 1;  

        }  
        else  
        {  
            if (state == 1)  
            {  
                count = 100;//  
            }  
            else  
            {  
                count = -100;//负数代表向下移动  
            }  
            //控制鼠标滑轮滚动,count代表滚动的值,负数代表向下,正数代表向上,如-100代表向下滚动100的y坐标  
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, count, 0);  
            if (state == 1)  
            {  
                state = 0;  
            }  
            else  
            {  
                state = 1;  
            }  

        }  

    }  

    private void btn_start_Click(object sender, EventArgs e)  
    {  
        timer2.Enabled = false;  
        timer1.Enabled = true;  
        move_long = int.Parse(txt_long.Text);  
        settime = int.Parse(txt_time.Text);  
        int_X =int.Parse(txt_X.Text);  
        int_Y = int.Parse(txt_Y.Text);  
        timer1.Interval = 3000;  
    }  

    //停止按钮  
    private void btn_end_Click(object sender, EventArgs e)  
    {  
        timer1.Enabled = false;  
        timer1.Interval = 3000;  
    }  

    //获取鼠标的位置  
    private void timer2_Tick(object sender, EventArgs e)  
    {  
        textBox1.Text= Cursor.Position.X.ToString();  
        textBox2.Text = Cursor.Position.Y.ToString();  
    }  

记录下了第一次编写了一个可以为自己服务的一个小程序,感觉还是非常开心的。(刷金币的行为是不值得的,回报很少而且浪费精力。发表这篇博客只是为了和大家分享一些知识和我能够通过自己的写程序满足自己的想法的喜悦。)

WinAPI-Wrapper 模拟鼠标点击 用于模拟鼠标移动点击、窗口操作等的Windows API包装器类。 API 下面是一些可用的方法的总结。有更多的方法和类,比下面列出的要多,但目的是要大致了解包装器能做什么。要查看关于特定方法的详细信息和参数的详细信息,请查看代码本身,因为它的注释很好。 Mouse.cs public static void LeftClick(); public static void RightClick(); public static void MiddleClick(); public static void LeftDown(); public static void LeftUp(); public static void RightDown(); public static void RightUp(); public static void MiddleDown(); public static void MiddleUp(); public static void Move(int x, int y); public static void LeftDrag(Point point1, Point point2, int interval, int lag); Window.cs public static bool DoesExist(string windowTitle); public static IntPtr Get(string windowTitle); public static IntPtr GetFocused(); public static void SetFocused(IntPtr hWnd); public static bool IsFocused(IntPtr hWnd); public static void Move(IntPtr hWnd, int x, int y); public static void Resize(IntPtr hWnd, int width, int height); public static void Hide(IntPtr hWnd); public static void Show(IntPtr hWnd); public static Rectangle GetDimensions(IntPtr hWnd); public static Size GetSize(IntPtr hWnd); public static Point GetLocation(IntPtr hWnd); public static string GetTitle(IntPtr hWnd); public static void SetTitle(IntPtr hWnd, string title); public static void Maximize(IntPtr hWnd); public static void Minimize(IntPtr hWnd); public static void Normalize(IntPtr hWnd); public static Bitmap Screenshot(IntPtr hWnd); public static void RemoveMenu(IntPtr hWnd); public static void Close(IntPtr hWnd); public static void DisableCloseButton(IntPtr hWnd); public static void DisableMaximizeButton(IntPtr hWnd); public static void DisableMinimizeButton(IntPtr hWnd); public static void EnableMouseTransparency(IntPtr hWnd); public static Point ConvertToWindowCoordinates(IntPtr hWnd, int x, int y); public static Point GetCoordinateRelativeToWindow(IntPtr hWnd); Desktop.cs public static Bitmap Screenshot(); public static void HideTaskBar(); public static void ShowTaskBar(); public static int GetWidth(); public static int GetHeight(); 使用 在windows api文件夹中编译代码会产生一个.dll文件。任何引用这个.dll的ccode都可以使用包装器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值