C# Windows API 操作鼠标键盘

C# Windows API 操作鼠标键盘

    • (一)、SetCursorPos 函数
    • (二)、mouse_event 函数
    • (三)、keybd_event 函数
    • (四)、SendInput 函数
    • (五)、将像素坐标转化为绝对坐标点

(一)、SetCursorPos 函数

将光标移动到指定的屏幕坐标。

函数使用 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

(二)、mouse_event 函数

函数合成的鼠标移动和按钮的点击。

函数使用 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

(三)、keybd_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

(四)、SendInput 函数

合成击键,鼠标动作和按钮单击。

函数使用 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

你可能感兴趣的:(windows)