• 遍历系统中所有的进程,可根据名字或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;
    }
  • 相关阅读:
    C语言文本文件实现局部修改
    TTMS框架设计思路及实例介绍
    浅谈函数与操作符的重载
    Java:继承与多态
    Java:类与对象(二)
    Java : 类与对象(一)
    C语言 数的阶乘、高次幂、大数加法及大数乘法
    C语言下的位运算
    enum:枚举类型介绍与简单使用
    C语言实现字符界面下的学生管理成绩系统
  • 原文地址:https://www.cnblogs.com/xslwm/p/9465215.html
Copyright © 2020-2023  润新知