2017-07-14 55 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

コールバックプロシージャ(第1パラメータを 'EnumWindows'にキャスト)する必要がある場合は、それを間違って宣言しています。 –

+4

文字列を 'std :: vector 'に保存してみませんか? –

答えて

2

EnumWindowsの2番目のパラメータは以下のように記載され:

コールバック関数に渡されるアプリケーション定義の値。

あなたは例えば、単純にそう、あなたのコールバック関数にアプリケーション定義の値を渡す必要があるので:

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)と、第2引数に間違った型(longは64ビットWindowsでも32ビットである)の両方を使用していません。 32ビットWindows(longが署名されている場合)でさえも、longタイプのパラメータを使用して安全にポインタを渡すことはできません。あなたのEnumWindows呼び出しでCスタイルのキャストを取り除くことによって、コンパイラに助けてもらいます。

関連する問題