通过Windows进程ID获取窗口句柄

来源:互联网 发布:营养配餐软件 编辑:程序博客网 时间:2024/05/30 05:17


通过Windows进程ID获取窗口句柄
方法一:使用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的方式

///< 通过进程ID获取窗口句柄HWND CProcessTimeRestart::GetWindowHwndByPorcessID(DWORD dwProcessID){    DWORD dwPID = 0;    HWND hwndRet = NULL;    // 取得第一个窗口句柄    HWND hwndWindow = ::GetTopWindow(0);    while (hwndWindow)    {        dwPID = 0;        // 通过窗口句柄取得进程ID        DWORD dwTheardID = ::GetWindowThreadProcessId(hwndWindow, &dwPID);        if (dwTheardID != 0)        {            // 判断和参数传入的进程ID是否相等            if (dwPID == dwProcessID)            {                // 进程ID相等,则记录窗口句柄                hwndRet = hwndWindow;                break;            }        }        // 取得下一个窗口句柄        hwndWindow = ::GetNextWindow(hwndWindow, GW_HWNDNEXT);    }    // 上面取得的窗口,不一定是最上层的窗口,需要通过GetParent获取最顶层窗口    HWND hwndWindowParent = NULL;    // 循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄    while (hwndRet != NULL)    {        hwndWindowParent = ::GetParent(hwndRet);        if (hwndWindowParent == NULL)        {            break;        }        hwndRet = hwndWindowParent;    }    // 返回窗口句柄    return hwndRet;}


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

HWND hwnd = ::FindWindow(NULL, "Test");::SendMessage(hwnd, WM_CLOSE, 0, 0);


1 0
原创粉丝点击