窗体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
8UINT SendInput( UINT cInputs, // INPUT数组的长度,用ARRAYSIZE()计算数组Size LPINPUT pInputs, // INPUT数组的指针 int cbSize // INPUT结构体的大小 );
INPUT结构体:
复制代码1
2
3
4
5
6
7
8
9
10
11
12typedef 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
17typedef struct tagMOUSEINPUT { LONG dx; //绝对位置的X值或相对位置的偏移像素数 LONG dy; //绝对位置的Y值或相对位置的偏移像素数 DWORD mouseData; //鼠标数据,对于不同的dwFlags有不同的用处 DWORD dwFlags; //事件类型 DWORD time; //时间戳,不指定则系统默认指定 ULONG_PTR dwExtraInfo; //与鼠标事件关联的附加值。应用程序调用GetMessageExtraInfo来获取此额外信息。 } MOUSEINPUT, *PMOUSEINPUT, *LPMOUSEINPUT;
4.2 dx
和dy
参数
鼠标的绝对位置,或自上次生成鼠标事件以来的运动量,具体取决于dwFlags
成员的值。绝对数据指定为鼠标的 xy 坐标;相对数据指定为移动的像素数。
4.3 dwFlags
参数
宏 | 值 | 含义 |
---|---|---|
MOUSEEVENTF_ABSOLUTE | 0x8000 | dx 和 dy 成员包含规范化的绝对坐标。如果未设置标志,dx 和 dy 包含相对数据(自上次报告位置以来位置的变化)。可以设置或不设置此标志,无论连接到系统时连接的是哪种鼠标或其他指针设备(如果有)。有关相对鼠标运动的更多信息,请参阅以下备注部分。 |
MOUSEEVENTF_HWHEEL | 0x01000 | 如果鼠标有滚轮,则车轮已水平移动。移动量在鼠标数据中指定。视窗XP/2000 :不支持此值。 |
MOUSEEVENTF_MOVE | 0x0001 | 移动发生。 |
MOUSEEVENTF_MOVE_NOCOALESCE | 0x2000 | WM_MOUSEMOVE不会将消息并和。默认行为是将WM_MOUSEMOVE 消息。视窗XP/2000 :不支持此值。 |
MOUSEEVENTF_LEFTDOWN | 0x0002 | 按下了左按钮。 |
MOUSEEVENTF_LEFTUP | 0x0004 | 左侧按钮已释放。 |
MOUSEEVENTF_RIGHTDOWN | 0x0008 | 按下了右按钮。 |
MOUSEEVENTF_RIGHTUP | 0x0010 | 右按钮已释放。 |
MOUSEEVENTF_MIDDLEDOWN | 0x0020 | 按下中间按钮。 |
MOUSEEVENTF_MIDDLEUP | 0x0040 | 中间按钮已释放。 |
MOUSEEVENTF_VIRTUALDESK | 0x4000 | 将地图坐标映射到整个桌面。必须与MOUSEEVENTF_ABSOLUTE 。 |
MOUSEEVENTF_WHEEL | 0x0800 | 如果鼠标有轮子,则车轮已移动。移动量在鼠标数据中指定。 |
MOUSEEVENTF_XDOWN | 0x0080 | 按下了 X 按钮。 |
MOUSEEVENTF_XUP | 0x0100 | 释放 X 按钮。 |
4.4 绝对坐标和像素坐标之间的转换
由于dx
和dy
的含义绝对坐标,是相对于屏幕而言的,左上角就是 (0,0) 右下角就是 (65535,65535)
我们需要把常用的像素坐标与屏幕分辨率运算才能得到dx
和dy
的值。
复制代码
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
13typedef 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_EXTENDEDKEY | 0x0001 | 如果指定,扫描代码前面有一个前缀字节,其值为 0xE0 (224)。 |
KEYEVENTF_KEYUP | 0x0002 | 如果指定,则正在释放Key。如果未指定,则按下该键。 |
KEYEVENTF_SCANCODE | 0x0008 | 如果指定,wScan 将标识Key,而 wVk 将被忽略。 |
KEYEVENTF_UNICODE | 0x0004 | 如果指定,系统合成一个VK_PACKET 。wVk 参数必须为零。此标志只能与KEYEVENTF_KEYUP 合并。有关详细信息,请参阅备注部分。 |
最后
以上就是勤劳手机最近收集整理的关于枚举窗体、模拟键鼠操作函数的全部内容,更多相关枚举窗体、模拟键鼠操作函数内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复