1

次のコードを使用して、一番上のウィンドウのハンドルを取得しています。

HWND hwnd;
hwnd = GetForegroundWindow();

これに関する問題は、システム全体の最上位を返すことです。自分のアプリケーションからのみ最上位を取得する方法はありますか?

アプリケーションの最上位のウィンドウのみを取得したい。これは、GetForegroundWindow() のようにシステム全体の最上位ウィンドウではなく、自分のアプリの最上位ウィンドウを取得するための API が必要であることを意味します。ありがとう!

編集:

わかりました、ここではっきりさせてください。私の問題は、MY アプリケーションに属していないウィンドウの HWND を取得できることです。私が取得したいのは、私のアプリケーションのみの TOPMOST です。HWND が別のアプリケーションに属している場合、情報を取得する必要はありません。

4

3 に答える 3

4

EnumWindows() で使用できるコールバックを次に示します。

BOOL CALLBACK FindTopmostWnd(HWND hwnd, LPARAM lParam)
{
    HWND* pHwnd = (HWND*)lParam;

    HWND myParent = hwnd;
    do
    {
        myParent = GetParent(myParent);
    }
    while (myParent && (myParent != *pHwnd));

    if (myParent != 0)
    {
        // If the window is a menu_worker window then use it's parent
        TCHAR szClassName[7];
        while (0 != GetClassName(hwnd, szClassName, 7)
            && 0 != _tcsncmp(szClassName, TEXT("Dialog"), 6)
            && 0 != _tcsncmp(szClassName, TEXT("Afx"), 3)
            )
        {
            // find the worker's parent
            hwnd = GetParent(hwnd);
        }

        *pHwnd = hwnd;

        return FALSE;
    }

    return TRUE;
}

Adam が指摘するように、EnumWindows() に渡される LPARAM は、HWND へのポインターである必要があります。したがって、おそらく次のようなことをしたいと思うでしょう:

HWND hTopmostWnd = hWnd;
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd);
于 2009-07-13T14:26:28.433 に答える
1

次のように、 GetTopWindow関数を使用します。

HWND hwnd;
hwnd = GetTopWindow(NULL);
于 2009-07-13T13:56:44.077 に答える
0

これを正確に実行する関数があるかどうかはわかりませんが、おそらく自分で作成することができます。アプリケーションウィンドウにすべて特定のウィンドウクラスがある場合は、FindWindowまたはFindWindowExを使用できます。

または、GetForegroundWindowを使用してすべてのアプリケーションからフォアグラウンドウィンドウを取得してから、GetWindowLongを使用してHINSTANCEを確認することもできます。アプリケーションからのものでない場合は、アプリケーションから最初のウィンドウが見つかるまで、(GetWindowを使用して)Zオーダーでウィンドウを列挙し続けます。

于 2009-07-13T13:56:47.867 に答える