2013-06-01 3 views
7

MSDN говорит следующее о GetParent функции:Правильный способ получения родительского окна

Для получения родительского окна и не владельца, вместо того, чтобы использовать GetParent, используйте GetAncestor с флагом GA_PARENT ,

Но при вызове GetAncestor(hWnd, GA_PARENT); для окна, который не имеет родителя, он возвращает окно рабочего стола, в то время как GetParent возвращается NULL.

Итак, каков правильный способ получения родителя (а не владельца) и получения NULL, если его нет?

Конечно, я мог проверить, возвращает ли GetAncestor окно рабочего стола, но это похоже на хак для меня.

+1

Правильный способ - вызвать GetAncestor и определить рабочий стол. –

+3

Родитель окна верхнего уровня * - это окно рабочего стола. Сравните со значением GetDesktopWindow(), чтобы обнаружить это, а не совсем взломать, если вы также не занимаетесь несколькими настольными компьютерами. В противном случае это осложнилось тем, что SetParent() поддерживает программы Windows 3.x, где использование окна другого процесса в качестве родителя еще не было плохой идеей. –

+0

Итак, вы говорите, что окно рабочего стола отличается для разных мониторов? Как мне это обработать? – Ben

ответ

6

Вот что я придумал:

// 
// Returns the real parent window 
// Same as GetParent(), but doesn't return the owner 
// 
HWND GetRealParent(HWND hWnd) 
{ 
    HWND hParent; 

    hParent = GetAncestor(hWnd, GA_PARENT); 
    if(!hParent || hParent == GetDesktopWindow()) 
     return NULL; 

    return hParent; 
} 
0

немного лучше версии, которая идет как «маршруты», и если он не может найти правильный родитель, оно вернет само окно (чтобы избежать пустых ссылок). Использование GetParent вместо GetAncestor работало в моем случае и вернуло окно, в котором я был.

public static IntPtr GetRealParent(IntPtr hWnd) 
    { 
     IntPtr hParent; 

     hParent = GetAncestor(hWnd, GetAncestorFlags.GetParent); 
     if (hParent.ToInt64() == 0 || hParent == GetDesktopWindow()) 
     { 
      hParent = GetParent(hWnd); 
      if (hParent.ToInt64() == 0 || hParent == GetDesktopWindow()) 
      { 
       hParent = hWnd; 
      } 

     } 

     return hParent; 
    } 
Смежные вопросы