lengshizai 2024-02-17 18:46 采纳率: 31.7%
浏览 29
已结题

C++ QT获取多个相同窗口的句柄并区分

假定说 我打开三个记事本 记事本标题一样 类名一样 那么如何区分并提取想要窗口的句柄?
前提是:不修改内存以控制句柄。
比如下图

img

比如说 想获取 aa的句柄 但是通过findwindows 标题 类名 都一样 该怎么区分?
在编写自动脚本代替手动工作时遇到程序多开 但是无法区分的情况。
程序类名 及标题都完全相同,请指教。
请提供详细代码(C++ 及QT 示例各1 ) 并解释思路。
如果是内存地址 加偏移的方式获取也可以(但是请详细讲解方法及示例代码)

通过内存的方法可以解决也可以 有一定基础。

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-17 18:47
    关注

    引自免费微信小程序:皆我百晓生

    在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编程技术,例如查找窗口内的某个特定控件(如编辑框)并通过其相对偏移来定位父窗口。这种情况下,代码会更加复杂且不通用,通常不推荐这样做,除非你对目标窗口有非常具体且深入的理解。

    由于上述方法并不适用于所有情况,因此,在编写自动化脚本时,更好的解决方案可能是检查窗口堆栈顺序、窗口层级关系、窗口内部特定控件的状态,或者利用其他应用程序特有的特征来进行区分。对于多开的标准记事本应用,可能还需要结合用户交互(如键盘焦点变化)等手段来准确识别目标窗口。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月20日
  • 修改了问题 2月17日
  • 创建了问题 2月17日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3