C++ EnumWindows,将列表存储在字符串数组中

C++ EnumWindows, store the list in a string array

本文关键字:字符串 数组 存储 列表 EnumWindows C++      更新时间:2023-10-16

我是C++的新手,几周前我才开始学习。 目前,我正在尝试将具有特定类名的所有窗口的标题存储在动态字符串数组中。 到目前为止,我将 LIST 定义为全局变量,但我想使用局部变量并将其传递给 EnumWindows 函数。

string* LIST=new string[10];
int N;
int main(){
N=0;
EnumWindows((WNDENUMPROC)CreateList,0);
for(int i=0;i<N;i++){
cout << LIST[i]<< endl;
}
return 0
}
BOOL CreateList(HWND hWnd, long lParam){
char TitleArray[255], ClassArray[255];
GetWindowText(hWnd,TitleArray,254);
GetClassName(hWnd,ClassArray,254);
string ClassString=ClassArray;
string TitleString=TitleArray;
if (ClassString=="CLASS_NAME"){
LIST[N]=TitleString;
N++;
}
return TRUE;
}

EnumWindows 的第二个参数记录为:

要传递给回调函数的应用程序定义值。

由于您需要将应用程序定义的值传递给回调函数,因此只需这样做,例如:

int main() {
std::vector<std::string> windowTitles;
::EnumWindows(&CreateList, reinterpret_cast<LPARAM>(&windowTitles));
// ...
}

若要在回调中检索指向窗口标题容器的指针,lParam参数需要恢复其类型:

BOOL CALLBACK CreateList(HWND hWnd, LPARAM lParam) {
std::vector<std::string>& windowTitles =
*reinterpret_cast<std::vector<std::string>*>(lParam);
// Use windowTitles, e.g. windowTitles.push_back(TitleString);
// ...
}

特别注意,您的CreateList签名是错误的。它既缺少调用约定(CALLBACK),也缺少第二个参数的错误类型(即使在 64 位 Windows 中long也是 32 位宽)。你不能安全地使用long类型的参数传递指针,即使在32位Windows(long是有符号的)中也是如此。让编译器通过删除EnumWindows调用中的 C 样式强制转换来帮助您。