プログラミングメモ →目次

すべてのウィンドウのハンドルを列挙する(VC++)

すべてのウィンドウのハンドルを列挙する方法についてのメモです。マイクロソフトのヘルプによると、FindWindowEx()APIは、指定された文字列と一致するクラス名とウィンドウ名文字列を持つウィンドウのハンドルを返します。この関数は、子ウィンドウを検索します。この関数による検索は、指定された子ウィンドウの直後の子ウィンドウから開始されます。

FindWindowEx()関数で、回帰呼び出しの関数で、デスクトップ上にあるすべてのウィンドウのハンドルを列挙することができます。


例1.すべてのウィンドウのハンドルとタイトルを列挙する。

void EnumerateAllWindow(HWND hWndParent)
{
    HWND hWnd;

    TCHAR buff[MAX_PATH];
    ::GetWindowText(hWndParent, buff, sizeof(buff));
    TRACE(_T("HWND=%08x, Caption=%s\r\n"), hWndParent, buff);

    hWnd = ::FindWindowEx(hWndParent, NULL, NULL, NULL);
    while (hWnd != NULL)
    {
        EnumerateAllWindow(hWnd);
        hWnd = ::FindWindowEx(hWndParent, hWnd, NULL, NULL);
    }
}

void Test()
{
    HWND hDeskTop = ::GetDesktopWindow();
    EnumerateAllWindow(hDeskTop);
}

例2.すべてのウィンドウを再描画させる。

void RedrawAllWindow(HWND hWndParent)
{
    HWND hWnd;
    ::SendMessage(hWndParent, WM_NCPAINT, 1, 0); 
    ::InvalidateRect(hWndParent, NULL, TRUE);
    hWnd = ::FindWindowEx(hWndParent, NULL, NULL, NULL);
    while (hWnd != NULL)
    {
        RedrawAllWindow(hWnd);
        hWnd = ::FindWindowEx(hWndParent, hWnd, NULL, NULL);
    }
}