遍歷系統中所有的進程,可根據名字或ID查找某一個線程


我們這根據名字查找進程,獲取其ID

 1 /*@brief 獲取找到的與指定進程名相符的第一個進程ID
 2 * @param [in]        cpszExeFileName        進程可執行文件名(不帶路徑)
 3 * @param [in/out]    dwPID                返回找到的名字符合的第一個進程ID
 4 * @return 成功 : S_OK    失敗 : 錯誤碼
 5 */
 6 HRESULT FindFirstProcessIdByName(const TCHAR* cpszExeFileName, DWORD &dwPID)
 7 {
 8     HRESULT hr = E_FAIL;
 9 
10     PROCESSENTRY32 pe = { 0 };
11     HANDLE hSnapshot = NULL;
12 
13     if (NULL == cpszExeFileName)
14     {
15         hr = HRESULT_FROM_WIN32(ERROR_BAD_ARGUMENTS);
16         goto Exit0;
17     }
18 
19     pe.dwSize = sizeof(PROCESSENTRY32);//在使用這個結構前,先設置它的大小
20     //可以獲取系統中正在運行的進程信息,線程信息,等
21     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
22     //TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。
23     //TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。
    //TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程
24 //第二個參數 25 //一個進程ID號,用來指定要獲取哪一個進程的快照,當獲取系統進程列表或獲取 當前進程快照時可以設為0 26 27 if (INVALID_HANDLE_VALUE == hSnapshot) 28 { 29 hr = HRESULT_FROM_WIN32(GetLastError()); 30 goto Exit0; 31 } 32 33 if (FALSE == Process32First(hSnapshot, &pe)) 34 { 35 hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_FILES); 36 goto Exit0; 37 } 38 39 hr = S_FALSE; 40 do 41 { 42 std::wcout << (std::wstring)pe.szExeFile << L",ID: " << pe.th32ProcessID << std::endl;; 43 if (0 == _tcscmp(cpszExeFileName, pe.szExeFile)) 44 { 45 dwPID = pe.th32ProcessID; 46 hr = S_OK; 47 break; 48 } 49 } while (Process32Next(hSnapshot, &pe)); 50 51 Exit0: 52 if (hSnapshot) 53 { 54 CloseHandle(hSnapshot); 55 hSnapshot = NULL; 56 } 57 58 return hr; 59 }

 2.根據進程ID查找窗口句柄

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;
}
HWND GetWindowHwndByPID(const 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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM