简言:
每个人都有身份证号,这个身份证号就是个人的唯一标识符
进程也是如此,每个进程也有唯一的标识符,来标记自身是独一无二的
如下图:其中PID :Process ID,即进程ID
但是我们怎么去在编程中去获取某个应用的PID呢?
当然就是用到我们的WinAPI:GetWindowThreadProcessId函数
GetWindowThreadProcessId函数:
检索创建指定窗口的线程的标识符,以及创建该窗口的进程(可选)的标识符。
语法:
DWORD GetWindowThreadProcessId(
[in] HWND hWnd,
[out, optional] LPDWORD lpdwProcessId
);
参数
[in] hWnd
类型:HWND
窗口的句柄。
[out, optional] lpdwProcessId
类型: LPDWORD
long pointer DWORD 4字节
指向接收进程标识符的变量的指针(实际上就是变量的内存地址)。 如果此参数不为 NULL, 则 GetWindowThreadProcessId 会将进程的标识符复制到变量;否则,它不会。 如果函数失败,则变量的值保持不变。
返回值
类型:DWORD
如果函数成功,则返回值是创建窗口的线程的标识符。 如果窗口句柄无效,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
要求:
实例/代码:
首先我们随意打开一个软件:
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <wchar.h> // 需要引入宽字符库
#include <locale.h> // 需要包含 locale.h 头文件
#include <windows.h>//window api函数
#include <tchar.h>
#include <urlmon.h>
int main()
{
HWND Hwnd = FindWindowA(NULL, "Cheat Engine 7.4");
DWORD Pid1 = NULL;
GetWindowThreadProcessId(
Hwnd,
&Pid1
);
printf("pid=%d",Pid1);
getchar();
return 1;
}
说明:
先用FindWindowA找到应用的句柄
之后定义一个变量。
最后使用GetWindowThreadProcessId函数
他会给参数二(Pid1)相关应用的一个指针(内存地址)
结果: