2017-07-14 128 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風格轉換來幫助您。

相關問題