Получить верхнее окно моего собственного приложения ТОЛЬКО - в C - PullRequest
1 голос
/ 13 июля 2009

Я использую следующий код для получения дескриптора самого верхнего окна:

HWND hwnd;
hwnd = GetForegroundWindow();

Проблема в том, что он возвращает самый верхний уровень всей системы. Есть ли способ получить ТОП-ТОЛЬКО из моего собственного приложения?

Я хочу получить самое верхнее окно ТОЛЬКО из моего приложения. Это означает, что мне нужен API для получения самого верхнего окна моего приложения, а НЕ общесистемного верхнего окна, как это делает GetForegroundWindow (). Спасибо!

EDIT:

ОК, позвольте мне прояснить ситуацию. Моя проблема в том, что я могу получить HWND для окна, которое не принадлежит МОЕМ приложению. То, что я хочу получить, это ТОП-ТОЛЬКО ТОЛЬКО для моей заявки. Если HWND принадлежит другому приложению, я не должен получать информацию.

Ответы [ 3 ]

4 голосов
/ 13 июля 2009

Вот обратный вызов, который вы можете использовать с 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;
}

Как указывает Адам, LPARAM, передаваемый в EnumWindows (), должен быть указателем на HWND. Так что вы, вероятно, хотите сделать что-то вроде этого:

HWND hTopmostWnd = hWnd;
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd);
1 голос
/ 13 июля 2009

Используйте функцию GetTopWindow , как это:

HWND hwnd;
hwnd = GetTopWindow(NULL);
0 голосов
/ 13 июля 2009

Я не знаю, что есть функция, которая делает именно это, но вы могли бы написать ее самостоятельно. Если все окна вашего приложения имеют определенный класс окон, то вы можете использовать FindWindow или FindWindowEx.

В качестве альтернативы, вы можете использовать GetForegroundWindow для получения окна переднего плана из всех приложений, а затем использовать GetWindowLong для проверки HINSTANCE. Если это не из вашего приложения, продолжайте перечислять окна по Z-порядку (используя GetWindow), пока не найдете первое из своего приложения.

...