Как получить дескрипторы для всех окон другого приложения - PullRequest
0 голосов
/ 26 июля 2010

в моем приложении у меня есть таймер, в TimerProc я хочу получить дескрипторы всех окон (основного и дочернего) другого приложения, которое имеет фокус. Я понятия не имею, как это сделать, потому что я не понимаю такие функции, как GetNextWindow или GetParent и Z-oder окон, и я не могу найти где-нибудь очень подробное объяснение того, как эти функции работают (я не понимаю объяснения в msdn). Пожалуйста, вы можете дать мне совет или блок кода, который делает это? Большое спасибо за ответ.

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Используйте функцию GetForegroundWindow () - она ​​возвращает HWND окна, с которым в данный момент работает пользователь. Затем, имея эту ручку, вы можете получить childs таким образом:

 HWND a_hWnd = (HWND)hParent;
  HWND a_FirstChild = NULL;
  a_FirstChild = ::GetWindow(a_hWnd, GW_CHILD);

  if (a_FirstChild != NULL)
  {

    HWND a_NextChild = NULL;
    do
    {
      a_NextChild = ::GetWindow(a_FirstChild, GW_HWNDNEXT);
      if (a_NextChild != NULL)
      {
        a_FirstChild = a_NextChild;
      }
    }
    while (a_NextChild != NULL);
}
1 голос
/ 26 июля 2010

GetForeGroundWindow для получения текущего окна / диалога переднего плана
GetParent до тех пор, пока вы не получите NULL (что приведет вас к окну верхнего уровня) **
EnumChildWindows для доступа ко всем зависимым окнам

** Обратите внимание, что приложение может иметь более одного окна верхнего уровня, хотя это не обычно.

Код:

void Ccpp_testDlg::DoWalk ()
{
   HWND hCurrent;
   HWND hNew;

   hCurrent = ::GetForegroundWindow ();
   hNew     = hCurrent;

   while (hNew != NULL)
   {
      hNew = ::GetParent (hCurrent);
      if (hNew != NULL) 
      {
         hCurrent = hNew;
      }
   }
   EnumChildWindows (hCurrent, EnumProc, 0);
}

BOOL CALLBACK EnumProc (HWND hwnd,LPARAM lParam)
{
   TCHAR szText [MAX_PATH];
   GetWindowText (hwnd, szText, sizeof(szText));
   // do something with text
   return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...