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

概述

窗体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 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的值。

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

最后

以上就是勤劳手机为你收集整理的枚举窗体、模拟键鼠操作函数的全部内容,希望文章能够帮你解决枚举窗体、模拟键鼠操作函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部