找寻窗口句柄

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 Learnicon-default.png?t=N7T8https://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;
}

工具:Syp++  , 可执行程序:spyxx.exe ,visual studio 自带的工具,用于查找窗口

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值