2009-07-13 2 views
1

Я использую следующий код, чтобы получить ручку верхнего окна:Получить верхнее окно моего собственного приложения ТОЛЬКО - в C

HWND hwnd; 
hwnd = GetForegroundWindow(); 

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

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

EDIT:

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

+1

Я знаю, что это довольно старый вопрос, тем не менее, я чувствую себя обязанным добавить ссылку на http://blogs.msdn.com/b/oldnewthing/archive/ 2008/10/06/8969399.aspx –

ответ

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; 
} 

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

HWND hTopmostWnd = hWnd; 
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd); 
+1

Вы также должны указать, что LPARAM, переданный в 'EnumWindows()', должен быть указателем на HWND. –

+0

где вы получаете hWnd? – wonderer

+0

Любой существующий HWND из вашего приложения должен работать. – Jared

1

Используйте GetTopWindow Function, так:

HWND hwnd; 
hwnd = GetTopWindow(NULL); 
+0

«Функция GetTopWindow проверяет порядок Z дочерних окон, связанных с указанным родительским окном, и возвращает дескриптор дочернего окна в верхней части порядка Z». Что делать, если главное окно моего приложения - это самое верхнее? – wonderer

+0

С 'NULL' в качестве параметра вы получите самое верхнее окно, даже если это главное окно. Вы имеете в виду, что вы не хотите главного окна? –

+0

GetTopWindow() дает мне дескриптор элемента на панели задач, а не дескриптор окна. при попытке получить окно rect я получаю только кнопки кнопки панели задач – wonderer

0

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

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

+0

спасибо за ответ, но мне нужно короткое короткое решение. – wonderer