Windows-process

TARTUPINFO结构体 指定进程窗口特性

typedef struct _STARTUPINFO 
{ 
    DWORD cb;                //包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段.应用程序必须将cb初始化为sizeof(STARTUPINFO) 
    PSTR lpReserved;         //保留。必须初始化为NULL
    PSTR lpDesktop;          //用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果lpDesktop是NULL(这是最常见的情况 ),那么该进程将与当前桌面相关联 
    PSTR lpTitle;            //用于设定控制台窗口的名称。如果lpTitle是NULL,则可执行文件的名字将用作窗口名.This parameter must be NULL for GUI or console processes that do not create a new console window.
    DWORD dwX;               //用于设定应用程序窗口相对屏幕左上角位置的x 坐标(以像素为单位)。 
    DWORD dwY;               //对于GUI processes用CW_USEDEFAULT作为CreateWindow的x、y参数,创建它的第一个重叠窗口。若是创建控制台窗口的应用程序,这些成员用于指明相对控制台窗口的左上角的位置
    DWORD dwXSize;           //用于设定应用程序窗口的宽度(以像素为单位)
    DWORD dwYSize;           //子进程将CW_USEDEFAULT 用作CreateWindow 的nWidth、nHeight参数来创建它的第一个重叠窗口。若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度 
    DWORD dwXCountChars;     //用于设定子应用程序的控制台窗口的宽度(屏幕显示的字节列)和高度(字节行)(以字符为单位) 
    DWORD dwYCountChars; 
    DWORD dwFillAttribute;   //用于设定子应用程序的控制台窗口使用的文本和背景颜色 
    DWORD dwFlags;           //请参见下一段和表4-7 的说明 
    WORD wShowWindow;        //用于设定如果子应用程序初次调用的ShowWindow 将SW_*作为nCmdShow 参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是通常用于ShowWindow 函数的任何一个SW_*标识符,除了SW_SHOWDEFAULT. 
    WORD cbReserved2;        //保留。必须被初始化为0 
    PBYTE lpReserved2;       //保留。必须被初始化为NULL
    HANDLE hStdInput;        //用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,hStdInput 用于标识键盘缓存,hStdOutput 和hStdError用于标识控制台窗口的缓存 
    HANDLE hStdOutput; 
    HANDLE hStdError; 
} STARTUPINFO, *LPSTARTUPINFO;

PROCESS_INFORMATION存储线程的相关信息

    typedef struct _PROCESS_INFORMATION { 
        HANDLE hProcess; //存放每个对象的与进程相关的句柄 
        HANDLE hThread;        //返回的线程句柄。 
        DWORD dwProcessId;    //用来存放进程ID号 
        DWORD dwThreadId;      //用来存放线程ID号 
    } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

PROCESSENTRY32 存放进程信息快照

 PROCESSENTRY32结构如下:    
  typedef   struct   tagPROCESSENTRY32   {    
  DWORD   dwSize;   //   结构大小;    
  DWORD   cntUsage;   //   此进程的引用计数;    
  DWORD   th32ProcessID;   //   进程ID;    
  DWORD   th32DefaultHeapID;   //   进程默认堆ID;    
  DWORD   th32ModuleID;   //   进程模块ID;    
  DWORD   cntThreads;   //   此进程开启的线程计数;    
  DWORD   th32ParentProcessID;//   父进程ID;    
  LONG   pcPriClassBase;   //   线程优先权;    
  DWORD   dwFlags;   //   保留;    
  char   szExeFile[MAX_PATH];   //   进程全名;    
  }   PROCESSENTRY32;

CreateToolhelp32Snapshot

HANDLE_WINAPI CreateToolHelp32Snapshot(
                                       DWORD dwFlags,   //指定了获取系统进程快照的类型
                                       DWORD th32ParentProcessID//指向要获取进程快照的ID,获取系统内所有进程快照时是0
                                      );

Process32First与Process32Next

如果CreateToolhelp32Snapshot函数调用成功返回快照句柄 需要调用Process32First函数查找系统进程的第一个进程

BOOL Process32First(
                    HANDLE hSnapshot,
                    LPROCESSENTRY32 lppe
                   );

再调用Process32Next函数列出系统中其它进程

BOOL Process32Next(
                    HANDLE hSnapshot,
                    LPROCESSENTRY32 lppe
                   );

一个输出系统进程的demo

    #include <stdio.h>
    #include <windows.h>
    #include <string.h>
    #include <tlhelp32.h>
    int GetProcess()
    {
        //PROCESSENTRY32结构体,保存进程具体信息
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(pe32);
        //获得系统进程快照的句柄
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hProcessSnap == INVALID_HANDLE_VALUE)
        {
            printf("CreateToolhelp32Snapshot error.\n");
            return 0;
        }
        //首先获得第一个进程
        BOOL bProcess = Process32First(hProcessSnap, &pe32);
        //循环获得所有进程
        while (bProcess)
        {
            //打印进程名和进程ID
            printf("%ls----%d\n", pe32.szExeFile, pe32.th32ProcessID);
            bProcess = Process32Next(hProcessSnap, &pe32);
        }
        CloseHandle(hProcessSnap);
        return 0;
    }
    int main()
    {
        GetProcess();
        return 0;
    }