C++ EnumWindows,将列表存储在字符串数组中
C++ EnumWindows, store the list in a string array
我是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 样式强制转换来帮助您。
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组