通过Windows进程ID获取窗口句柄(C++)

方法一:使用EnumWindows的方式`

///< 枚举窗口参数
typedef struct
    { 
       HWND hwndWindow; // 窗口句柄
       DWORD dwProcessID; // 进程ID
    }EnumWindowsArg;
///< 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    { 
       EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
       DWORD dwProcessID = 0;
       // 通过窗口句柄取得进程ID
       ::GetWindowThreadProcessId(hwnd, &dwProcessID);
       if (dwProcessID == pArg->dwProcessID)
              { 
                     pArg->hwndWindow = hwnd;
                     // 找到了返回FALSE
                     return FALSE;
               }
         // 没找到,继续找,返回TRUE
         return TRUE;
    }
///< 通过进程ID获取窗口句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
    { 
       HWND hwndRet = NULL;
       EnumWindowsArg ewa;
       ewa.dwProcessID = dwProcessID;
       ewa.hwndWindow = NULL;
       EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
       if (ewa.hwndWindow)
           { 
               hwndRet = ewa.hwndWindow;
           }
       return hwndRet;
    }

方法二:使用GetTopWindow和GetNextWindow的方式

///< 枚举窗口参数
typedef struct
    { 
        HWND hwndWindow; // 窗口句柄
        DWORD dwProcessID; // 进程ID
    }EnumWindowsArg;
///< 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    { 
        EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
        DWORD dwProcessID = 0;
        // 通过窗口句柄取得进程ID
        ::GetWindowThreadProcessId(hwnd, &dwProcessID);
        if (dwProcessID == pArg->dwProcessID)
            { 
                pArg->hwndWindow = hwnd;
                // 找到了返回FALSE
                return FALSE;
            }
        // 没找到,继续找,返回TRUE
        return TRUE;
    }
///< 通过进程ID获取窗口句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
    { 
        HWND hwndRet = NULL;
        EnumWindowsArg ewa;
        ewa.dwProcessID = dwProcessID;
        ewa.hwndWindow = NULL;
        EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
        if (ewa.hwndWindow)
            { 
                hwndRet = ewa.hwndWindow;
            }
        return hwndRet;
    }

通过以上两种窗口获得的句柄,和使用FindWindow获得的句柄是一样的。
可以通过SendMessage向窗口发送消息

HWND hwnd = ::FindWindow(NULL, "Test");
::SendMessage(hwnd, WM_CLOSE, 0, 0);
    原文作者:mengxiangde
    原文地址: https://blog.csdn.net/mengxiangde/article/details/102663702
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞