C#采用mouse_event函数实现模拟鼠标功能

下面我通过代码为大家分享下C#模拟鼠标,具体内容如下:

想必有很多人在项目开发中可能遇见需要做模拟鼠标点击的小功能,很多人会在百度过后采用mouse_event这个函数,不过我并不想讨论如何去使用mouse_event函数怎么去使用,因为那没有多大意义。

?


1

2

3

4

5

6

7

8

static void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo)

{

 int x = dx, y = dy;

 edit_position(dwFlags, dx, dy, ref x, ref y);

 IntPtr hWndFromPoint = WindowFromPoint(x, y);

 screen_to_client(hWndFromPoint, ref x, ref y);

 send_message(hWndFromPoint, dwFlags, cButtons, x, y);

}

上述代码你发现了什么?如果你发现说明你知道了本文到底在写什么东东 说不定你会有一些兴趣看下去,不过想到我如今混那么凄惨 在工地上做干活 不过也还好。

鼠标点击目标时会向鼠标所点击目标窗口投递消息,根据鼠标的按键、状态不同会投递不同的消息,一个完整的“鼠标左键单击”事件过程为“WM_LBUTTONDOWN +

WM_LBUTTONUP”即鼠标“先左键按下 + 后左键抬起”,由于mouse_event可以模拟鼠标点击过程而不是直接性一次完整的鼠标单击过程,所以同样存在“按下、抬起”

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP | MOUSEEVENTF_MOVE, -450, 0, 1, 0);  
mouse_event在没有提供MOUSEEVENTF_MOVE量时光标不会移动到相对位置,“光标相对位置=光标现行位置+新光标位置”如果提供量“MOUSEEVENTF_ABSOLUTE”绝对位置,则会以“新光标位置”为准而不会添加“光标现行位置”

?


1

2

3

4

5

6

7

8

9

10

static void edit_position(int dwFlags, int dx, int dy, ref int x, ref int y)

{

 Point pos = MousePosition;

 x = x + pos.X;

 y = y + pos.Y;

 if ((dwFlags | MOUSEEVENTF_ABSOLUTE) == dwFlags)

  SetCursorPos(dx, dy);

 if ((dwFlags | MOUSEEVENTF_MOVE) == dwFlags)

  SetCursorPos(x, y);

}

edit_position函数主要用于对MOUSEEVENTF_MOVE于MOUSEEVENTF_ABSOLUTE

相对/绝对光标位置修改的一个支持

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

static void send_message(IntPtr hWnd, int dwFlags, int cButtons, int x, int y)

{

 if ((dwFlags | MOUSEEVENTF_LEFTDOWN) == dwFlags)

  SendMessage(hWnd, WM_LBUTTONDOWN, cButtons, MakeDWord(x, y));

 if ((dwFlags | MOUSEEVENTF_LEFTUP) == dwFlags)

  SendMessage(hWnd, WM_LBUTTONUP, cButtons, MakeDWord(x, y));

 if ((dwFlags | MOUSEEVENTF_RIGHTDOWN) == dwFlags)

  SendMessage(hWnd, WM_RBUTTONDOWN, cButtons, MakeDWord(x, y));

 if ((dwFlags | MOUSEEVENTF_RIGHTUP) == dwFlags)

  SendMessage(hWnd, WM_RBUTTONUP, cButtons, MakeDWord(x, y));

 if ((dwFlags | MOUSEEVENTF_MIDDLEDOWN) == dwFlags)

  SendMessage(hWnd, WM_MBUTTONDOWN, cButtons, MakeDWord(x, y));

 if ((dwFlags | MOUSEEVENTF_MIDDLEUP) == dwFlags)

  SendMessage(hWnd, WM_MBUTTONUP, cButtons, MakeDWord(x, y));

}

send_message函数主要用于模拟鼠标点击的过程,上面我提到“先左键按下 + 后左键抬起”在上面的代码中你会看的清楚的不得了,如果相反你可以去尝试一番会有什么后果与其说

不如你们自己做更要来的快些。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

static int MakeDWord(int low, int high)

{

 return low + (high * Abs(~ushort.MaxValue));

}

static int Abs(int value)

{

 return ((value >> 31) ^ value) - (value >> 31);

}

MakeDWord / 合并整数,函数主要是把两个short合并为一个int,分为low、high两部分

 

 

static bool screen_to_client(IntPtr hwnd, ref int x, ref int y)

{

 bool bRetVal = false;

 Point lpptPos = new Point(x, y);

 if ((bRetVal = ScreenToClient(hwnd, ref lpptPos)))

 {

  x = lpptPos.X;

  y = lpptPos.Y;

 }

 return bRetVal;

}

screen_to_client函数故名思意,它主要用于把屏幕上的坐标转换到窗口客户上对应坐标

public const int WM_LBUTTONDOWN = 513; // 鼠标左键按下

public const int WM_LBUTTONUP = 514; // 鼠标左键抬起

public const int WM_RBUTTONDOWN = 516; // 鼠标右键按下

public const int WM_RBUTTONUP = 517; // 鼠标右键抬起

public const int WM_MBUTTONDOWN = 519; // 鼠标中键按下

public const int WM_MBUTTONUP = 520; // 鼠标中键抬起

public const int MOUSEEVENTF_MOVE = 0x0001; // 移动鼠标  

public const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 鼠标左键按下 

public const int MOUSEEVENTF_LEFTUP = 0x0004; // 鼠标左键抬起 

public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; // 鼠标右键按下 

public const int MOUSEEVENTF_RIGHTUP = 0x0010; // 鼠标右键抬起  

public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; // 鼠标中键按下

public const int MOUSEEVENTF_MIDDLEUP = 0x0040; // 鼠标中键抬起  

public const int MOUSEEVENTF_ABSOLUTE = 0x8000; // 绝对坐标

[DllImport("user32.dll", SetLastError = true)]

public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);

[DllImport("user32.dll", SetLastError = true)]

public static extern IntPtr WindowFromPoint(int xPoint, int yPoint);

[DllImport("user32.dll", SetLastError = true)]

public static extern int SetCursorPos(int x, int y);

[DllImport("user32.dll", SetLastError = true)]

public static extern bool ScreenToClient(IntPtr hWnd, ref Point lppt);

// [DllImport("user32", SetLastError = true)]

// public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

鼠标右键单击(静默):

复制代码代码如下:

mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 1, 0);

鼠标左键双击(静默):

复制代码代码如下:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 2, 0);

鼠标移动(相对位置):

复制代码代码如下:

mouse_event(MOUSEEVENTF_MOVE, 100, 50, 0, 0);

鼠标移动(绝对位置):

复制代码代码如下:

mouse_event(MOUSEEVENTF_ABSOLUTE, 100, 50, 0, 0);

以上内容比较多请认真学习,希望能够帮助到大家。

原文地址:https://www.cnblogs.com/ssslgf/p/10231331.html

时间: 2024-10-11 10:36:12

C#采用mouse_event函数实现模拟鼠标功能的相关文章

C# 模拟鼠标(mouse_event)

想必有很多人在项目开发中可能遇见需要做模拟鼠标点击的小功能,很多人会在 百度过后采用mouse_event这个函数,不过我并不想讨论如何去使用mouse_event 函数怎么去使用,因为那没有多大意义. [csharp] view plaincopy static void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo) { int x = dx, y = dy; edit_position(dwFl

用Mouse_event()来模拟鼠标操作(转载)

在自动化测试的开发中,有一些控件的ID是很难找到的,所以有些时候,我们直接设置鼠标的位置,然后是用click事件,会收到很好的效果.在Windows API中有个mouse_event函数为我们准备好了这一切. 这个函数在user32.dll这个库文件里面.我们可以在C:\WINDOWS\system32(XP系统)这个目录下找到这个文件,他是系统自带的. 我们以C#直接调用这个文件中的API为例子来说下怎么进行鼠标操作,首先在我们C#中声明引用,如果是一个基于From的程序,这个声明的位置写在

VC模拟鼠标的两种方式(SendMessage、mouse_event)

鼠标模拟的常用方案,包括发送鼠标事件消息和使用mouse_event系统函数,发送鼠标消息的例子如下: pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x); 这种方法不需要窗体在前端,甚至最小化也可以使用,但是此方法并不是在所有场合有效,特别是对于不响应鼠标消息的程序更是如此.在这种情况下,可以尝试使用mouse_event函数.首先给出mouse_event函数的原型: VOID mouse_event(           DWORD dwFl

Delphi下利用WinIo模拟鼠标键盘详解

http://www.cnblogs.com/rogee/archive/2010/09/14/1827248.html 本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现SendInput对某程序居然无效,无奈只好开始研究WinIo.上网查了很多资料,发现关于WinIo模拟鼠标键盘的资料很少,有的也只是支言片语讲的不是很详细,而且大部分都是关于模拟键

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

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

MFC中热键&模拟键盘&模拟鼠标的使用

1. 热键的使用 热键不用了的话一定要卸载,否则下次启动时会被占用. 函数原型 注册函数 BOOL RegisterHotKey( HWND hWnd, // handle to window int id, // hot key identifier UINT fsModifiers, // key-modifier options UINT vk // virtual-key code ); hWnd------窗口句柄: id------热键的标识:(如果是exe 这个标识的范围就在0-4

C#模拟鼠标键盘控制其他窗口(一)

编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的执行,开发出了客户端,与移动服务器进行通信,但是这有一些缺点.如果移动的服务器对接口进行变更,我所编写的客户端也要进行相应的升级.如果服务器的协议进行了更改,甚至个人编写的这种第三方客户端需要重写.而我个人也没有这个时间和精力,或者说没有足够的利益支撑我继续去重构飞信耗子.因此,这款还算优秀的软件,现在就束之

零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘

1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飞鸽传书 IP Messenger")); if(hwnd != NULL) { //修改窗口标题 ::SetWindowText(hwnd,"新的窗口标题"); } else { ::MessageBox(NULL,TEXT("窗口没

qtday02 qt做简单的加法器和模拟登陆功能

//在3t2目录下 //adder.h /* qt简单加法计算器 */ #ifndef ADDER_H #define ADDER_H #include<QDialog> #include<QLineEdit> #include<QtWidgets/QPushButton> #include<QtWidgets/QLabel> class Adder:public QDialog{ Q_OBJECT//让自定义的槽函数生效 private: QLineEdi