概述
窗体API
1.1 窗体赋值/取值
// 窗体标题赋值:
SetWindowText(句柄,数据缓存区);
// 窗体标题取值:
GetWindowText(句柄,数据缓冲区,长度);
1.2 查找窗体
// 查找指定窗口:
FindWindow(类名, 窗体名);
1.3 切换窗体(显示/隐藏)
// 切换窗体——获取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);
// 显示窗口
BOOL ShowWindow(
HWND hWnd,
// 窗口句柄
int
nCmdShow
// 显示模式
);
// 隐藏(最小化)窗口
BOOL CloseWindow(HWND hwnd);
1.4 查找子窗体
// 查找子窗体
// 如果前2个参数都为NULL,则搜索所有顶级窗口和仅消息窗口
FindWindowExW(
HWND hWndParent,
// 父窗体句柄
HWND hWndChildAfter, // 从传入子窗体的以Z排序的下一个子窗体
LPCWSTR lpszClass,
// 类名
LPCWSTR lpszWindow
// 标题
);
FindWindowExA(...);
// 获取子窗口:
GetDlgItem(hDlg,IDC_EDIT_TIMER);
1.5 枚举窗体
// 枚举所有窗体
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
// 回调函数,操作获取的每一个窗体
_In_ LPARAM lParam
// 用于向回调函数传值
);
// 枚举所有子窗体
BOOL WINAPI EnumChildWindows(
_In_opt_ HWND hWndParent,
// 父窗体句柄,此参数为NULL时相当于EnumWindows()
_In_ WNDENUMPROC lpEnumFunc,
// 回调函数,操作获取每一个子窗体
_In_ LPARAM lParam
// 用于向回调函数传值
);
// 枚举窗体的回调函数
// 返回true继续回调,返回false结束回调
BOOL CALLBACK EnumOpenWindowProc(
HWND hWnd,
//窗体句柄
LPARAM lParam
//传参
);
//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
// 设置鼠标位置
BOOL WINAPI SetCursorPos(
_In_ int X,
_In_ int Y
);
// 设置鼠标位置的另一种方法在SendInput方法中实现
三、键鼠API——SendInput()
该函数集成了点击按键、鼠标动作和按钮点击。
UINT SendInput(
UINT
cInputs, // INPUT数组的长度,用ARRAYSIZE()计算数组Size
LPINPUT pInputs, // INPUT数组的指针
int
cbSize // INPUT结构体的大小
);
INPUT结构体:
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
结构体
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 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
的值。
// 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
结构体
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_EXTENDEDKEY | 0x0001 | 如果指定,扫描代码前面有一个前缀字节,其值为 0xE0 (224)。 |
KEYEVENTF_KEYUP | 0x0002 | 如果指定,则正在释放Key。如果未指定,则按下该键。 |
KEYEVENTF_SCANCODE | 0x0008 | 如果指定,wScan 将标识Key,而 wVk 将被忽略。 |
KEYEVENTF_UNICODE | 0x0004 | 如果指定,系统合成一个VK_PACKET 。wVk 参数必须为零。此标志只能与KEYEVENTF_KEYUP 合并。有关详细信息,请参阅备注部分。 |
最后
以上就是勤劳手机为你收集整理的枚举窗体、模拟键鼠操作函数的全部内容,希望文章能够帮你解决枚举窗体、模拟键鼠操作函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复