代码之家  ›  专栏  ›  技术社区  ›  sanjuro

如何获取其他应用程序所有窗口的句柄

  •  0
  • sanjuro  · 技术社区  · 14 年前

    在我的应用程序中,我有计时器,在TimerProc中,我想获取另一个应用程序的所有窗口(主窗口和子窗口)的句柄。我不知道该怎么做,因为我不理解像getnexthindow或getparent和z-order这样的函数,我也找不到任何关于这个函数如何工作的非常详细的解释(我不理解有关msdn的解释)。请你给我一些建议,或者给我一块代码,哪一块可以?非常感谢你的回答。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Kurovsky    14 年前

    使用getForegroundWindow()函数-返回用户当前正在使用的窗口的Hwnd。 有了这个手柄,你就可以这样找回孩子了:

     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);
    }
    
        2
  •  1
  •   Bob Moore    14 年前

    获取当前前景窗口/对话框的GetForegroundWindow
    获取parent直到得到空值(这将使您进入顶层窗口)**
    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;
    }