2024年3月28日发(作者:)
C#控制鼠标动作
可以通过两个函数操作鼠标:
1. [DllImport("")]
2. static extern bool SetCursorPos(int X, int Y);
3. [DllImport("")]
4. static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr ex
traInfo);
5. [Flags]
6. enum MouseEventFlag : uint
7. {
8. Move = 0x0001,
9. LeftDown = 0x0002,
10. LeftUp = 0x0004,
11. RightDown = 0x0008,
12. RightUp = 0x0010,
13. MiddleDown = 0x0020,
14. MiddleUp = 0x0040,
15. XDown = 0x0080,
16. XUp = 0x0100,
17. Wheel = 0x0800,
18. VirtualDesk = 0x4000,
19. Absolute = 0x8000
20. }
SetCursorPos使鼠标移动到指定位置;mouse_event使用MouseEventFlag枚举中的Move,也可以使鼠标移动。
mouse_event中使用不同的枚举值可以模拟不同的鼠标事件。
值得注意的是有几点:
1. 我们不能用mouse_event(, 10, 10, 0, );去模拟在(10, 10)处的左键事件,我们需要把这步拆成两步:
第一步:移动鼠标到(10,10)处,用SetCursorPos(10, 10);
第二步:触发左键,用mouse_event(, 0, 0, 0, );
本质上是两步的事件,不能把window API 想的太聪明,认为它会自动跑到(10,10)处,再左键
2. MouseEventFlag的枚举值可以多个一起用,使用 | 操作符
鼠标左键按下和松开两个事件的组合即一次单击: mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
两次连续的鼠标左键单击事件构成一次鼠标双击事件: mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
3. MouseEventFlag中有个Absolute枚举,如果没指定Absolute,那么mouse_event的操作是相对于上次鼠标所
在的位置;如果指定了Absolute,那么是相对于整个屏幕坐标的位置。
这里要注意,指定Absolute,鼠标的坐标会被约束在[0, 65535]之间。0即对应屏幕左,65535即对应屏幕右下角。
MSDN原话如下:
If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between
0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto
the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.
所以模拟在(10, 10)处的左键,代码应改为:
mouse_event(MOUSEEVENTF_LEFTDOWN, 10 * 65536 / , 10 * 65536 /, 0, 0);
如果显示器是一拖二的,想在第二个屏上使用mouse_event,就不能用
了
C# Win32API 模拟鼠标移动及点击事件
这个函数在这个库文件里面。我们可以在C:WINDOWSsystem32〔XP系统〕这个目录下找到这个文件,他是
系统自带的。我们以C#直接调用这个文件中的API为例子来说下怎么进展鼠标操作,首先在我们C#中声明引用,
如果是一个基于From的程序,这个声明的位置写在你的From class就可以了
[("user32")]
private static extern intmouse_event(intdwFlags, intdx, intdy, intcButtons, intdwExtraInfo); 参数意
义 dwFlags Long,下表中标志之一或它们的组合 dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指
定x,y方向的绝对位置或相对位置 cButtons Long,没有使用 dwExtraInfo Long,没有使用 dwFlags常数意
义
const int MOUSEEVENTF_MOVE = 0x0001; 移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002; 模拟鼠标左键按下
const int MOUSEEVENTF_LEFTUP = 0x0004; 模拟鼠标左键抬起
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010; 模拟鼠标右键抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEUP = 0x0040; 模拟鼠标中键抬起
const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标 程序中我们直接调用
mouse_event函数就可以了 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500,
500, 0, 0);
1、这里是鼠标左键按下和松开两个事件的组合即一次单击: mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
2、模拟鼠标右键单击事件: mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0,
0, 0, 0 )
3、两次连续的鼠标左键单击事件构成一次鼠标双击事件: mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) mouse_event (MOUSEEVENTF_LEFTDOWN |
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
4、使用绝对坐标
MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 需要说明的是,如果没有使用
MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数
认为是当前鼠标所在的点。5、直接设定绝对坐标并单击 mouse_event(MOUSEEVENTF_LEFTDOWN, X *
65536 / 1024, Y * 65536 / 768, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y
* 65536 / 768, 0, 0); 其中X,Y分别是你要点击的点的横坐标和纵坐标 而键盘模拟用
Keybd_event() Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消
息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。Keybd_event共有四个参数,第
一个为按键的虚拟键值,如回车键为vk_return,tab键为vk_tab。第二个参数为扫描码,一般不用设置,用0代
替就行。第三个参数为选项标志,如果为keydown那么置0即可,如果为keyup那么设成“KEYEVENTF_KEYUP〞,
第四个参数一般也是置0即可。用如下代码即可实现模拟按下i键,其中的 49 表示i键的虚拟键值:
mouse_event
编辑
本词条缺少概述、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
中文名
模拟按键
外文名
mouse_event
函数功能
综合鼠标击键和鼠标动作
参 数
标志位集
简介编辑
1
2
3
4
5
6
7
函数功能:该函数综合鼠标击键和鼠标动作。
VOID
mouse_event(
DWORD
dwFlags, // motion and click options
DWORD
dx, // horizontal position or change
DWORD
dy, // vertical position or change
DWORD
dwData, // wheel movement
ULONG_PTR
dwExtraInfo // application-defined information
);
参数编辑
dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是以下值的任何合理组合:
MOUSEEVENTF_ABSOLUTE:说明参数dX,dy含有标准化的绝对坐标。如果不设置此位,参数含有相对
数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的
设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注局部:
MOUSEEVENTF_MOVE:说明发生移动。
MOUSEEVENTF_LEFTDOWN:说明接按下鼠标左键。
MOUSEEVENTF_LEFTUP:说明松开鼠标左键。
MOUSEEVENTF_RIGHTDOWN:说明按下鼠标右键。
MOUSEEVENTF_RIGHTUP:说明松开鼠标右键。
MOUSEEVENTF_MIDDLEDOWN:说明按下鼠标中键。
MOUSEEVENTF_MIDDLEUP:说明松开鼠标中键。
MOUSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,说明鼠标轮被移动。移动的数量由dwData
给出。
dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于
MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的
mickeys数。一个mickey表示鼠标移动的数量,说明鼠标已经移动。
dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于
MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的
mickeys数。
dwData:如果dwFlags为MOUSEEVENTF_WHEEL,那么dwData指定鼠标轮移动的数量。正值说明鼠标
轮向前转动,即远离用户的方向;负值说明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即
120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,那么dWData应为零。
dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessageExtraInfo来获得此附加
信息。
返回值:无。
备注编辑
如果鼠标被移动,用设置MOUSEEVENTF_MOVE来说明,dX和dy保存移动的信息。给出的信息是绝对或
相对整数值。
如果指定了MOUSEEVENTF_ABSOLUTE值,那么dX和dy含有标准化的绝对坐标,其值在0到65535之
间。事件程序将此坐标映射到显示外表。坐标〔0,0〕映射到显示外表的左上角,〔65535,65535〕映射到右下角。
如果没指定MOUSEEVENTF_ABSOLUTE,dX和dy表示相对于上次鼠标事件产生的位置〔即上次报告的位
置〕的移动。正值表示鼠标向右〔或下〕移动;负值表示鼠标向左〔或上〕移动。
鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应
用程序用函数SystemParameterslnfo来取得和设置这些值。
在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,
并且鼠标的加速等级非零,那么操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且
鼠标的加速等级为2,那么操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿X轴或
y轴的相对位移加到4倍。
一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1〔最慢〕到20〔最快〕,并代
表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。
函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之
外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件
通信的动态键接库〔DLL〕,获得附加的信息,并保存到一个队列中。DLL然后调用mouse_event,用标准按键和
x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用 DLL
〔连同存贮在dwEXtralnfo中的指针或索引〕,那么DLL返回附加信息。
Windows CE:Windows CE不支持参数dwFlags取MOUSE EVENTF WHEEL常数。
速查: Windows NT:及以上版本; Windows:95及以上版本;Windows CE:不支持;头文件:;输入库:。
vb要自己定义常量。
'鼠标事件常数
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10
dephi中的使用方法
mouse_event〔按下鼠标〔函数在上面〕,按下的位置xy,鼠标中间转轮0~120,程序的句柄,附加的消息,
返回值〔成功返回1〕〕;


发布评论