微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从EnumChildWindow获取窗口矩形列表并将其存储?

如何解决如何从EnumChildWindow获取窗口矩形列表并将其存储?

我使用了EnumChildWindows,并且可以获得所有子窗口中的HandleClassNameWindowText。但我也想获取所有子窗口的Rectangle。有可能吗?

这是我的代码

#include <iostream>
#include <windows.h>
using namespace std;

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LParaM lParam)
{
    char class_name[100];
    char title[100];

    GetClassNameA(hwnd,class_name,sizeof(class_name));
    GetwindowTextA(hwnd,title,sizeof(title));

    cout <<"Window name : "<<title<<endl;
    cout <<"Class name  : "<<class_name<<endl;
    cout <<"hwnd        : "<<hwnd<<endl<<endl;
                                                   
    return TRUE;
}

int main()
{
    POINT pt;
    Sleep(3000);

    GetCursorPos(&pt);
    HWND hwnd = WindowFromPoint(pt);
    HWND hwndParent = GetParent(hwnd);

    EnumChildWindows(hwndParent,EnumWindowsProc,0);

    system("PAUSE");
    return 0;
}

此外,如何存储每个子窗口的所有数据(句柄,类名,窗口文本,矩形)?也许在矢量列表中?

解决方法

对于第一个问题,您可以看看here

对于第二个问题,您可以定义一个包含所需字段的结构,例如

#include <iostream>
#include <windows.h>
#include <vector>

struct MyWindow {
 HWND handle_;
 std::string name_;
 std::string text_;
 RECT rect_;
 MyWindow(HWND handle,const std::string& name,const std::string& text,RECT rect): handle_{handle},name_{name},text_{text},rect_{rect}{}
};

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
    char name[100];
    char text[100];
    RECT rect{0};

    GetClassNameA(hwnd,name,sizeof(name));
    GetWindowTextA(hwnd,text,sizeof(text));
    GetWindowRect(hwnd,&rect);

    std::vector<MyWindow>* myVec = reinterpret_cast<std::vector<MyWindow>*>(lParam);

    if (myVec) {
      myVec->emplace_back(MyWindow(hwnd,std::string(name),std::string(text),rect));
    } else {
      // Pointer to vector is NULL,handle accordingly
     return FALSE;
    }

    return TRUE;
}

int main()
{
    POINT pt;
    Sleep(3000);

    std::vector<MyWindow> myChildWindows;

    GetCursorPos(&pt);
    HWND hwnd = WindowFromPoint(pt);
    HWND hwndParent = GetParent(hwnd);

    EnumChildWindows(hwndParent,EnumWindowsProc,reinterpret_cast<LPARAM>(&myChildWindows));

    for (const auto & childWindow: myChildWindows) {
            std::cout <<"Window name : "<< childWindow.name_ << std::endl;
            std::cout <<"Class name  : "<< childWindow.text_<< std::endl;
            std::cout <<"hwnd        : "<< childWindow.handle_<< std::endl;
            std::cout << "Rect: " << childWindow.rect_.left << "/" << childWindow.rect_.right << std::endl;
            std::cout << "---" << std::endl;
    }

    system("PAUSE");
    return 0;
}

编辑

我添加了更多代码和说明。这个示例应该可以编译并正常运行。

std::vector是一个序列容器,封装了动态大小数组1

在主函数中声明myChildWindows时,它会初始化为一个空向量,其中可以包含MyWindow类型的对象。您可以动态地向该向量添加和删除对象,即,您不必在编译时指定向量的大小,例如使用数组。然后,我们将指向此向量的指针传递给您的回调EnumWindowsProc。在此回调中,我们使用此指针将MyWindow类型的Object添加到向量中。当EnumChildWindows返回时,我们可以通过打印矢量中包含的每个对象来查看矢量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?