FindWindow
FindWindow这个函数检索顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。
该函数是个宏,定义如下
#ifdef UNICODE
#define FindWindow FindWindowW
#else
#define FindWindow FindWindowA
#endif // !UNICODE
FindWindowW 函数 (winuser.h) - Win32 apps | Microsoft Learn
FindWindowA 函数 (winuser.h) - Win32 apps | Microsoft Learn
与其他A和W结尾的win32 api一样,只是Unicode与Asicii字符的区别。
HWND FindWindowW(
[in, optional] LPCWSTR lpClassName,
[in, optional] LPCWSTR lpWindowName
);
参数说明:
lpClassName:窗口类名
lpWindowName:窗口标题
两个参数是可选的,提供任意一个,另一个设置为NULL,就可以找到想找的窗口句柄。
现在问题转化为如何找到窗口类名或者窗口标题。
何为窗口标题?如图,这位置包含标点符号在内的任何字符构成窗口标题。也可以通过EnumWindows 函数来找寻窗口类名和窗口标题。
窗口类名是创建窗口时候注册的系统的,没代码看不到。通过EnumWindows枚举窗口句柄可以找到目标窗口的窗口类名。
EnumWindows
该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。
MSDN: EnumWindows | Microsoft Learnhttps://learn.microsoft.com/en-us/previous-versions/aa925110(v=msdn.10)?redirectedfrom=MSDN
WINUSERAPI
BOOL
WINAPI
EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam);
参数说明
- lpEnumFunc:
[in] 回调函数指针,该函数会被系统调用,系统会设置HWND hwnd, LPARAM lParam 两个参数 - lParam
[in, out] 指定一个传递给回调函数的应用程序定义值,比如一个Vector,用来存储句柄
返回值
如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
回调函数示例
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
// 获取窗口标题
char title[256];
GetWindowTextA(hwnd, title, sizeof(title));
cout << title;
// 获取窗口类名
char className[256];
GetClassNameA(hwnd, className, sizeof(className));
cout << className << endl;
// 继续枚举下一个窗口
return TRUE;
}