我是靠谱客的博主 勤劳手机,这篇文章主要介绍枚举窗体、模拟键鼠操作函数,现在分享给大家,希望可以做个参考。

窗体API

1.1 窗体赋值/取值

复制代码
1
2
3
4
5
// 窗体标题赋值: SetWindowText(句柄,数据缓存区); // 窗体标题取值: GetWindowText(句柄,数据缓冲区,长度);

1.2 查找窗体

复制代码
1
2
3
// 查找指定窗口: FindWindow(类名, 窗体名);

1.3 切换窗体(显示/隐藏)

复制代码
1
2
3
4
5
6
7
8
// 切换窗体——获取SwithcToThisWindow函数指针 typedef void (WINAPI* PSWITCHTOTHISWINDOW) (HWND, BOOL); PSWITCHTOTHISWINDOW SwitchToThisWindow; HMODULE hUser32 = LoadLibrary(L"user32.dll"); SwitchToThisWindow = (PSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow"); // 切换窗体(TRUE显示,FALSE隐藏) SwitchToThisWindow(HWND hwnd, BOOL result);
复制代码
1
2
3
4
5
6
7
8
9
10
11
// 显示窗口 BOOL ShowWindow( HWND hWnd, // 窗口句柄 int nCmdShow // 显示模式 ); // 隐藏(最小化)窗口 BOOL CloseWindow(HWND hwnd);

1.4 查找子窗体

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
// 查找子窗体 // 如果前2个参数都为NULL,则搜索所有顶级窗口和仅消息窗口 FindWindowExW( HWND hWndParent, // 父窗体句柄 HWND hWndChildAfter, // 从传入子窗体的以Z排序的下一个子窗体 LPCWSTR lpszClass, // 类名 LPCWSTR lpszWindow // 标题 ); FindWindowExA(...);
复制代码
1
2
3
// 获取子窗口: GetDlgItem(hDlg,IDC_EDIT_TIMER);

1.5 枚举窗体

复制代码
1
2
3
4
5
6
7
8
// 枚举所有窗体 BOOL WINAPI EnumWindows( _In_ WNDENUMPROC lpEnumFunc, // 回调函数,操作获取的每一个窗体 _In_ LPARAM lParam // 用于向回调函数传值 );
复制代码
1
2
3
4
5
6
7
8
9
10
// 枚举所有子窗体 BOOL WINAPI EnumChildWindows( _In_opt_ HWND hWndParent, // 父窗体句柄,此参数为NULL时相当于EnumWindows() _In_ WNDENUMPROC lpEnumFunc, // 回调函数,操作获取每一个子窗体 _In_ LPARAM lParam // 用于向回调函数传值 );
复制代码
1
2
3
4
5
6
7
8
9
// 枚举窗体的回调函数 // 返回true继续回调,返回false结束回调 BOOL CALLBACK EnumOpenWindowProc( HWND hWnd, //窗体句柄 LPARAM lParam //传参 );
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//RECT结构体,用于存储窗口坐标 typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT; //获取窗口坐标 BOOL WINAPI GetWindowRect( _In_ HWND hWnd, // 窗体句柄 _Out_ LPRECT lpRect // TECT结构体指针 );

二、鼠标API

复制代码
1
2
3
4
5
6
7
// 设置鼠标位置 BOOL WINAPI SetCursorPos( _In_ int X, _In_ int Y ); // 设置鼠标位置的另一种方法在SendInput方法中实现

三、键鼠API——SendInput()

该函数集成了点击按键、鼠标动作和按钮点击。

复制代码
1
2
3
4
5
6
7
8
UINT SendInput( UINT cInputs, // INPUT数组的长度,用ARRAYSIZE()计算数组Size LPINPUT pInputs, // INPUT数组的指针 int cbSize // INPUT结构体的大小 );

INPUT结构体:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct tagINPUT { DWORD type; //INPUT的类型,对应下发union中不同的参数 union { MOUSEINPUT mi; //鼠标操作,对应INPUT_MOUSE类型 KEYBDINPUT ki; //键盘操作,对应INPUT_KEYBOARD类型 HARDWAREINPUT hi; //硬件操作,对应INPUT_HARDWARE类型 } DUMMYUNIONNAME; } INPUT, *PINPUT, *LPINPUT;

四、 SendInput()之操作鼠标

4.1 MOUSEINPUT结构体

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct tagMOUSEINPUT { LONG dx; //绝对位置的X值或相对位置的偏移像素数 LONG dy; //绝对位置的Y值或相对位置的偏移像素数 DWORD mouseData; //鼠标数据,对于不同的dwFlags有不同的用处 DWORD dwFlags; //事件类型 DWORD time; //时间戳,不指定则系统默认指定 ULONG_PTR dwExtraInfo; //与鼠标事件关联的附加值。应用程序调用GetMessageExtraInfo来获取此额外信息。 } MOUSEINPUT, *PMOUSEINPUT, *LPMOUSEINPUT;

4.2 dxdy参数

鼠标的绝对位置,或自上次生成鼠标事件以来的运动量,具体取决于dwFlags 成员的值。绝对数据指定为鼠标的 xy 坐标;相对数据指定为移动的像素数。

4.3 dwFlags参数

含义
MOUSEEVENTF_ABSOLUTE0x8000dxdy成员包含规范化的绝对坐标。如果未设置标志,dxdy包含相对数据(自上次报告位置以来位置的变化)。可以设置或不设置此标志,无论连接到系统时连接的是哪种鼠标或其他指针设备(如果有)。有关相对鼠标运动的更多信息,请参阅以下备注部分。
MOUSEEVENTF_HWHEEL0x01000如果鼠标有滚轮,则车轮已水平移动。移动量在鼠标数据中指定
视窗XP/2000:不支持此值。
MOUSEEVENTF_MOVE0x0001移动发生。
MOUSEEVENTF_MOVE_NOCOALESCE0x2000WM_MOUSEMOVE不会将消息并和。默认行为是将WM_MOUSEMOVE消息。
视窗XP/2000:不支持此值。
MOUSEEVENTF_LEFTDOWN0x0002按下了左按钮。
MOUSEEVENTF_LEFTUP0x0004左侧按钮已释放。
MOUSEEVENTF_RIGHTDOWN0x0008按下了右按钮。
MOUSEEVENTF_RIGHTUP0x0010右按钮已释放。
MOUSEEVENTF_MIDDLEDOWN0x0020按下中间按钮。
MOUSEEVENTF_MIDDLEUP0x0040中间按钮已释放。
MOUSEEVENTF_VIRTUALDESK0x4000将地图坐标映射到整个桌面。必须与MOUSEEVENTF_ABSOLUTE
MOUSEEVENTF_WHEEL0x0800如果鼠标有轮子,则车轮已移动。移动量在鼠标数据中指定
MOUSEEVENTF_XDOWN0x0080按下了 X 按钮。
MOUSEEVENTF_XUP0x0100释放 X 按钮。

4.4 绝对坐标和像素坐标之间的转换

由于dxdy的含义绝对坐标,是相对于屏幕而言的,左上角就是 (0,0) 右下角就是 (65535,65535)

我们需要把常用的像素坐标与屏幕分辨率运算才能得到dxdy的值。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// x,y为像素坐标。 dx = x * (65335/ScreenWidth) // 屏幕分辨率的长 dy = y * (65335/ScreenHeight)// 屏幕分辨率的宽 // 基于窗体的相对位置实现移动鼠标 // 获取窗体位置信息 RECT r; ::GetWindowRect(hwnd, &r); // 获取屏幕分辨路信息 RECT rWindow; ::GetWindowRect(GetDesktopWindow(), &rWindow); // 移动到相对于窗体左上角偏移(130,40)处,并鼠标左键点击 INPUT inputs[3] = { 0 }; inputs[0].type = INPUT_MOUSE; inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; inputs[0].mi.dx = (r.left + 130) * (65535 / (float)rWindow.right); inputs[0].mi.dy = (r.top + 40) * (65535 / (float)rWindow.bottom); inputs[1].type = INPUT_MOUSE; inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; inputs[2].type = INPUT_MOUSE; inputs[2].mi.dwFlags = MOUSEEVENTF_LEFTUP; SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));

五、SendInput()之操作键盘

5.1 KEYBOARDINPUT结构体

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct tagKEYBDINPUT { WORD wVk; // 虚拟键码;当dwFlags指定为KEYEVENTF_UNICODE时,值必须为0 WORD wScan; // 硬件键码;当dwFlags指定为KEYEVENTF_UNICODE时,则发送一个指定的Unicode字符 DWORD dwFlags; // 键盘输入类型 DWORD time; // 时间戳,不指定则系统默认指定 ULONG_PTR dwExtraInfo; // 与键盘事件关联的附加值。应用程序调用GetMessageExtraInfo来获取此额外信息。 } KEYBDINPUT, *PKEYBDINPUT, *LPKEYBDINPUT;

5.2 dwFlags参数

含义
KEYEVENTF_EXTENDEDKEY0x0001如果指定,扫描代码前面有一个前缀字节,其值为 0xE0 (224)。
KEYEVENTF_KEYUP0x0002如果指定,则正在释放Key。如果未指定,则按下该键。
KEYEVENTF_SCANCODE0x0008如果指定,wScan将标识Key,而 wVk 将被忽略。
KEYEVENTF_UNICODE0x0004如果指定,系统合成一个VK_PACKETwVk 参数必须为零。此标志只能与KEYEVENTF_KEYUP合并。有关详细信息,请参阅备注部分。

最后

以上就是勤劳手机最近收集整理的关于枚举窗体、模拟键鼠操作函数的全部内容,更多相关枚举窗体、模拟键鼠操作函数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部