2017-07-14 126 views
-3

我是C++新手,几个星期前我开始学习。 此刻,我试图将一个特定类名的所有窗口的标题存储在一个动态字符串数组中。 到现在为止我已经将LIST定义为一个全局变量,但是我想使用本地变量并将其传递给EnumWindows函数。C++ 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; 
} 
+5

你试图解决什么问题? – SergeyA

+1

如果您必须将回调过程(第一个参数转换为'EnumWindows'),那么您已声明它不正确。 –

+4

为什么不把你的字符串存储在'std :: vector '中? –

回答

2

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风格转换来帮助您。

相关问题