天天看點

通過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);
           
c++

繼續閱讀