枚举窗口

// 构建一个结构,希望存储目标窗口的句柄,标题栏,或者其他 匹配信息
typedef struct HwndandTitle {
  HWND hwnd;
  wchar_t* szTitle;
  //  其他 TODO ......
}HwndTitle;


 //    通过标题字符串查找窗口
void FindWindowByTitle(HWND hWnd, wchar_t* szTitle)
{
  HwndTitle* strHwndTitle = new HwndTitle;
  strHwndTitle -> hwnd = hWnd;
  strHwndTitle -> szTitle = new wchar_t[wcslen(szTitle)];
  strHwndTitle -> szTitle = szTitle;

  EnumWindows(EnumWindowsProc, (LPARAM)strHwndTitle);

//  strHwndTitle 结构中包含了 目标窗口的信息,TODO......

}

 

//   查找窗口的回调函数

INT_PTR CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
  int iTitleLen = GetWindowTextLength(hWnd);
  wchar_t* szWndTitle = new wchar_t[iTitleLen + 1];

  if (iTitleLen > 0)
  {
  GetWindowText(hWnd, szWndTitle, iTitleLen + 1);
  if (wcsstr(szWndTitle, ( ((HwndTitle *)lParam)->szTitle ) )!= NULL)
    {
    ((HwndTitle*)lParam) ->hwnd = hWnd;
    ((HwndTitle*)lParam)->szTitle = szWndTitle;
    return false;
    }
  }
  return TRUE;
}

================================================================================

//   查找窗口的回调函数 获取可见的,有标题的窗口
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    std::vector<std::pair<HWND, std::wstring>>* windowList = reinterpret_cast<std::vector<std::pair<HWND, std::wstring>>*>(lParam);

    // 过滤掉不可见的窗口
    if (!IsWindowVisible(hWnd))
        return TRUE; // 继续枚举

    // 获取窗口标题
    wchar_t title[256];
    GetWindowText(hWnd, title, 256);
    // 过滤掉没有标题的窗口
    if (wcslen(title) > 0)
        windowList->push_back(std::make_pair(hWnd, title));

    return TRUE; // 继续枚举
}

// 获取可见的,有标题的窗口
std::vector<std::pair<HWND, std::wstring>>* isVisualTitleWindows( ) {
    std::vector<std::pair<HWND, std::wstring>>* windowList = new std::vector<std::pair<HWND, std::wstring>>;

    // 枚举所有顶层窗口
    EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(windowList));

    return windowList;

}

posted @ 2025-01-15 17:24  O-Y  阅读(15)  评论(0)    收藏  举报