引自免费微信小程序:皆我百晓生
在C++ Qt中,处理多个相同标题和类名的窗口时获取特定窗口句柄并区分它们可能较为复杂,因为通常我们依赖于窗口的属性进行识别。由于你提到的情况是标准的记事本程序(不是基于Qt开发),因此这里我们将使用Windows API来辅助完成这个任务。
首先,你需要遍历所有顶级窗口,并获取每个窗口的相关信息。然后,可以通过窗口的位置、大小或其子窗口的特性等方法来间接区分这些窗口。但是,请注意这种方法有一定的局限性且不够稳定,因为它依赖于窗口的具体布局和行为。
以下是一个基本示例,展示了如何遍历所有窗口并打印它们的信息,但实际区分特定窗口可能需要更复杂的逻辑:
#include <windows.h>
#include <iostream>
int main() {
// 获取桌面窗口的句柄
HWND desktop = GetDesktopWindow();
// 遍历所有顶级窗口
EnumWindows([](HWND hwnd, LPARAM) -> BOOL {
TCHAR className[256];
GetClassName(hwnd, className, ARRAYSIZE(className));
std::wstring title;
int len = GetWindowTextLength(hwnd);
if (len > 0) {
title.resize(len + 1);
GetWindowText(hwnd, &title[0], len + 1);
title.resize(len); // Remove null terminator
// 这里简单判断类名是否为记事本(Notepad)
if (_wcsicmp(className, L"Notepad") == 0) {
// 假设通过窗口位置来区分
RECT rect;
GetWindowRect(hwnd, &rect);
// 打印窗口标题与左上角坐标以示区别
std::wcout << "Window Title: " << title << ", Position: (" << rect.left << ", " << rect.top << ")\n";
// 这里可以根据你的需求添加更精确的区分逻辑
// ...
}
}
return TRUE; // 继续遍历
}, 0);
return 0;
}
如果你确实需要根据内存地址或者其他底层方式来区分窗口,这将涉及到更深入的Windows编程技术,例如查找窗口内的某个特定控件(如编辑框)并通过其相对偏移来定位父窗口。这种情况下,代码会更加复杂且不通用,通常不推荐这样做,除非你对目标窗口有非常具体且深入的理解。
由于上述方法并不适用于所有情况,因此,在编写自动化脚本时,更好的解决方案可能是检查窗口堆栈顺序、窗口层级关系、窗口内部特定控件的状态,或者利用其他应用程序特有的特征来进行区分。对于多开的标准记事本应用,可能还需要结合用户交互(如键盘焦点变化)等手段来准确识别目标窗口。