如何从 EnumChildWindow 获取 Window 矩形的列表并存储它们?
How to get a list of Window Rectangle from EnumChildWindow and store them?
我用了EnumChildWindows
,我可以得到所有childwindows的Handle
、ClassName
和WindowText
。但是我也想得到所有的childwindows'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;
}
另外,如何存储每个 child windows 的所有数据(句柄、类名、窗口文本、矩形)?也许在矢量列表中?
你的第一个问题,你可以看看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
类型的对象添加到向量中。当 EnumChildWindows
returns 时,我们可以通过打印向量中包含的每个对象来查看向量。
我用了EnumChildWindows
,我可以得到所有childwindows的Handle
、ClassName
和WindowText
。但是我也想得到所有的childwindows'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;
}
另外,如何存储每个 child windows 的所有数据(句柄、类名、窗口文本、矩形)?也许在矢量列表中?
你的第一个问题,你可以看看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
类型的对象添加到向量中。当 EnumChildWindows
returns 时,我们可以通过打印向量中包含的每个对象来查看向量。