Win32API ウィンドウを検索する FindWindowEx

Windowsのデスクトップ上のウィンドウを検索するには、FindWindowEx関数を使う。


FindWindowExのプロトタイプ

HWND FindWindowEx(
  HWND hwndParent,      // 親ウィンドウのハンドル
  HWND hwndChildAfter,  // 子ウィンドウのハンドル
  LPCTSTR lpszClass,    // クラス名
  LPCTSTR lpszWindow    // ウィンドウ名
);


ウィンドウには親子の関係があり、これらのウィンドウを検索するには、再帰処理などで親子関係を手繰っていく必要がある。第二引数のhwndChidAfterはそれを実現するための引数である。



デスクトップ上のすべてのウィンドウを列挙するサンプルプログラム

再帰処理でウィンドウの親子関係を手繰って、デスクトップ上のウィンドウをすべて列挙する

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

void EnumetareWindows(HWND hWndParent)
{
    char szBuff[512];
    GetWindowTextA(hWndParent, szBuff, _countof(szBuff));
    printf("%s\n", szBuff);

    HWND hWndChild = FindWindowEx(hWndParent, NULL, NULL, NULL);
    if (hWndChild == NULL) {
        return;
    }

    do {
        EnumetareWindows(hWndChild);
    } while ( (hWndChild = FindWindowEx(hWndParent, hWndChild, NULL, NULL)) != NULL );
}

int main()
{
    HWND hWndParent = GetDesktopWindow();
    EnumetareWindows(hWndParent);
    return 0;
}




このように、実際にウィンドウに対して処理する部分をコールバック関数で実装すると、便利になると思います。

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

typedef BOOL (*LPFNENUMERATEWINDOWCALLBACK)(HWND hWnd);

void EnumetareWindows(HWND hWndParent, LPFNENUMERATEWINDOWCALLBACK lpfnCallback)
{
    if (lpfnCallback(hWndParent) == FALSE) {
        return;
    }

    HWND hWndChild = FindWindowEx(hWndParent, NULL, NULL, NULL);
    if (hWndChild == NULL) {
        return;
    }

    do {
        EnumetareWindows(hWndChild, lpfnCallback);
    } while ( (hWndChild = FindWindowEx(hWndParent, hWndChild, NULL, NULL)) != NULL );
}

BOOL SetWindowTextCallback(HWND hWnd)
{
    char szBuff[512];
    GetWindowTextA(hWnd, szBuff, _countof(szBuff));
    printf("%s\n", szBuff);
    return TRUE;
}

int main()
{
    HWND hWndParent = GetDesktopWindow();
    EnumetareWindows(hWndParent, SetWindowTextCallback);
    return 0;
}




上記の再帰処理によるサンプルプログラムを用いて、SetWindowText関数でデスクトップ上のすべてのウィンドウのキャプションを「あいうえお」と設定する例

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

typedef BOOL (*LPFNENUMERATEWINDOWCALLBACK)(HWND hWnd);

void EnumetareWindows(HWND hWndParent, LPFNENUMERATEWINDOWCALLBACK lpfnCallback)
{
    if (lpfnCallback(hWndParent) == FALSE) {
        return;
    }

    HWND hWndChild = FindWindowEx(hWndParent, NULL, NULL, NULL);
    if (hWndChild == NULL) {
        return;
    }

    do {
        EnumetareWindows(hWndChild, lpfnCallback);
    } while ( (hWndChild = FindWindowEx(hWndParent, hWndChild, NULL, NULL)) != NULL );
}

BOOL SetWindowTextCallback(HWND hWnd)
{
    SetWindowText(hWnd, TEXT("あいうえお"));
    return TRUE;
}

int main()
{
    HWND hWndParent = GetDesktopWindow();
    EnumetareWindows(hWndParent, SetWindowTextCallback);
    return 0;
}




参考
http://msdn.microsoft.com/ja-jp/library/cc410853.aspx