将光标移动到指定的屏幕坐标。
函数使用 C#
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
private static extern bool SetCursorPos(int dx, int dy);
参数详介:
dx、dy
光标的 x、y 坐标,以屏幕坐标表示。
返回值
如果成功返回非零,否则返回零。
更多参考:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setcursorpos
函数合成的鼠标移动和按钮的点击。
函数使用 C#
[DllImport("user32.dll", EntryPoint = "mouse_event")]
public static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, ulong dwExtraInfo);
参数详介
相对位置:即以当前位置开始计算偏移量;
绝对位置:屏幕左上角位置开始计算偏移量;
1、dwFlags
控制鼠标运动和按钮单击的各个方面。该参数可以是以下值的特定组合。
值 | 含义 |
---|---|
0x8000 | 包含则在 DX和 DY参数 为绝对位置,否则为相对位置。 |
0x0001 | 鼠标移动。 |
0x0002 | 左按钮按下。 |
0x0004 | 左按钮被释放。 |
0x0008 | 右按钮按下。 |
0x0010 | 右按压被释放。 |
0x0020 | 中间按钮按下。 |
0x0040 | 中间按钮向上。 |
0x0080 | X按钮按下。 |
0x0100 | X按钮被释放。 |
0x0800 | 鼠标滚轮旋转。 |
0x01000 | 滚轮按钮倾斜。 |
设置鼠标按钮状态的变化,而不是持续的状态。例如,如果按下并按住鼠标左键,则在第一次按下左键时设置 0x0002 。同样,仅在首次释放按钮时设置 0x0004 。
dwFlags 参数不能 同时 设定 0x0080、0x0100、0x0800、0x01000 ,因为它们都需要使用 dwData 参数。
2,3、dx,dy
鼠标沿x,Y轴的绝对位置或相对位置,取决于dwFlags参数是否设置了 0x8000 。绝对位置指鼠标的实际x坐标;相对位置指自上次鼠标事件后,移动的距离。
4、dwData
如果 dwFlags 参数包含 0x0800 ,则 dwData 指定鼠标滚轮转动量。正值向前旋转,负值向后旋转。一圈为 120。
如果 dwFlags 参数包含 0x01000,则 dwData 指定鼠标辊轮偏移量。正值表示辊轮向右倾斜;负值表示辊轮向左倾斜。
如果 dwFlags 包含0x0080 或0x0100 ,则 dwData 指定哪个X按钮被按下或释放。
值 | 含义 |
---|---|
0x0001 | 设置是否按下或释放第一个X按钮。 |
0x0002 | 设置是否按下或释放第二个X按钮。 |
如果 dwFlags 参数不包含 0x0080、0x0100、0x0800、0x01000,则 dwData 参数应该为零。
5、dwExtraInfo
与鼠标事件关联的附加值。应用程序调用GetMessageExtraInfo以获得此额外信息。
此函数已被 SendInput 取代,推荐使用 SendInput 函数。
更多参考:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event
合成击键。系统可以使用这种合成的按键来生成WM_KEYUP或WM_KEYDOWN消息。键盘驱动程序的中断处理程序调用keybd_event函数。
函数使用 C#
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(Byte bVk, Byte bScan, UInt32 dwFlags, ulong dwExtraInfo);
参数详介:
1、bVk
虚拟键码。该代码的值必须在1到254之间。
虚拟键码:https://blog.csdn.net/weixin_42686768/article/details/105918222
2、bScan
密钥的硬件扫描代码。
3、dwFlags
控制功能操作的各个方面。此参数可以是以下一个或多个值。
值 | 含义 |
---|---|
0x0001 | 如果指定,则在扫描代码之前添加一个前缀字节,该前缀字节的值为0xE0(224)。 |
0x0002 | 包含则释放按键。否则按下该键。 |
4、dwExtraInfo
与击键关联的附加值。
此函数已被 SendInput 取代,推荐使用 SendInput 函数。
更多参考:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-keybd_event
合成击键,鼠标动作和按钮单击。
函数使用 C#
[DllImport("user32.dll", EntryPoint = "SendInput")]
public static extern UInt32 SendInput(UInt32 cInputs, Input[] pInputs, int cbSize);
/*
cInputs:pInputs数组中的结构数。
pInputs:INPUT结构的数组。每个结构代表一个要插入键盘或鼠标输入流的事件。
cbSize:INPUT结构的大小(以字节为单位)。如果cbSize不是INPUT结构的大小,则该函数失败。
*/
[StructLayout(LayoutKind.Explicit)]
struct Input
{
[FieldOffset(0)] public Int32 type;
[FieldOffset(4)] public MouseInput mi;
[FieldOffset(4)] public tagKEYBDINPUT ki;
[FieldOffset(4)] public tagHARDWAREINPUT hi;
}
/*
type:输入事件的类型。该成员可以是以下值之一。
0,该事件是鼠标事件。使用 mi 结构。
1,该事件是键盘事件。使用 ki 结构。
2,该事件是硬件事件。使用 hi 结构。
mi:有关模拟鼠标事件的信息。
ki:有关模拟键盘事件的信息。
hi:有关模拟硬件事件的信息。
*/
[StructLayout(LayoutKind.Sequential)]
struct MouseInput
{
public Int32 dx;
public Int32 dy;
public Int32 dwData;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
}
/*
dx、dy、dwData、dwFlags、dwExtraInfo:与 mouse_event 函数对应的参数同义
time:事件的时间戳,以毫秒为单位。如果此参数为0,则系统将提供其自己的时间戳。
*/
[StructLayout(LayoutKind.Sequential)]
struct tagKEYBDINPUT
{
Int16 wVk;
Int16 wScan;
Int32 dwFlags;
Int32 time;
IntPtr dwExtraInfo;
}
/*
wVk、wScan、dwExtraInfo:与keybd_event 函数对应的参数同义。
dwFlags:指定按键的各个方面。该成员可以是以下值的某些组合。
0x0001 如果指定,则扫描代码之前是前缀字节,该前缀字节的值为0xE0(224)。
0x0002 如果指定,则释放密钥。如果未指定,则按下该键。
0x0008 如果指定,则wScan会识别密钥,而wVk将被忽略。
0x0004 如果指定,系统将合成VK_PACKET击键。该WVK参数必须为零。该标志只能与KEYEVENTF_KEYUP标志结合使用。
*/
[StructLayout(LayoutKind.Sequential)]
struct tagHARDWAREINPUT
{
Int32 uMsg;
Int16 wParamL;
Int16 wParamH;
}
/*
uMsg:输入硬件生成的消息。
wParamL:uMsg 参数的低位。
wParamH:uMsg 参数的高位。
*/
此函数可参考文章:https://blog.csdn.net/htsnoopy/article/details/7062922
更多参考:https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-sendinput
API中 dx,dy 含义是坐标,是相对屏幕的而言的,屏幕左上角的坐标为(0,0),右下角的坐标为(65535,65535)。而我们在C#中获得的对象(Frame,button,flash等)的坐标都是像素坐标,是跟你当前屏幕的分辨率相关的。假如你的显示器分辨率是1024*768,那么屏幕左上角的像素坐标是(0,0),右下角坐标为(1024,768)。
转换函数如下:
// 获取当前显示器分辨率
ScreenWidth=Screen.PrimaryScreen.WorkingArea.Width;
ScreenHeight=Screen.PrimaryScreen.WorkingArea.Height;
// 转换像素坐标(x、y为像素坐标)
dx = x * (65335/ScreenWidth)
dy = y * (65335/ScreenHeight)
python 操作键盘和鼠标:https://blog.csdn.net/weixin_42686768/article/details/105858987