2017-07-14 1 views
-3

Ich bin neu in C++, begann ich erst vor ein paar Wochen zu lernen. Im Moment versuche ich den Titel aller Fenster mit einem bestimmten Klassennamen in einem dynamischen String-Array zu speichern. Bisher habe ich LIST als globale Variable definiert, aber ich möchte eine lokale Variable verwenden und sie an die EnumWindows-Funktion übergeben.C++ EnumWindows, speichern Sie die Liste in einem String-Array

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

Was ist das Problem, das Sie versuchen zu lösen? – SergeyA

+1

Wenn Sie einen Callback-Proc (1. Param zu "EnumWindows") casten müssen, haben Sie es falsch deklariert. –

+4

Warum speichern Sie Ihre Strings nicht in einem 'std :: vector '? –

Antwort

2

Der zweite Parameter zu EnumWindows ist dokumentiert als:

ein anwendungsdefinierten Wert an die Callback-Funktion übergeben werden.

Da Sie einen anwendungsdefinierten Wert Ihrer Callback-Funktion übergeben müssen, tun einfach so, zum Beispiel:

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

Um einen Zeiger auf das Fenster Titel Container in den Rückruf abzurufen, die lParam Argument muss seine Art wieder haben:

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); 
    // ... 
} 

Beachten Sie besonders, dass Ihre CreateList Signatur falsch ist. Es fehlt sowohl eine Aufrufkonvention (CALLBACK) als auch die Verwendung des falschen Typs für das zweite Argument (long ist 32 Bit breit, sogar in 64-Bit-Windows). Sie können einen Zeiger mit einem Parameter vom Typ long nicht sicher übergeben, auch nicht in 32-Bit-Windows (long ist signiert). Lassen Sie sich vom Compiler helfen, indem Sie den C-Style-Cast in Ihrem EnumWindows-Aufruf entfernen.

Verwandte Themen