遍历进程链表找到游戏进程教程
为了省去自己注册窗口类,创建窗口类可以直接使用Windows提供的API 函数:DialogBox(hInstance, MAKEINTRESOURCE(IDD\_DIALOG\_MAIN), NULL, DialogProc);
//注册快捷键 F1
RegisterHotKey(hwnd, 1, 0, VK\_F1); //注册热键的系统API ,详细定义见MSDN;
- -
获取系统进程常用API:
CreateToolhelp32Snapshot()
Process32First()
Process32Next()
首先通过创建系统快照,然后通过函数Frist定位到需要获取的进程列表,最后通过Next 遍历一个个把列表值取出;
#include "stdafx.h"
#include "CprocessInfo.h"
#include "tlhelp32.h"
CprocessInfo::CprocessInfo() //构造函数
{
m_dwPid = 0;
m_hProcess = NULL;
}
CprocessInfo::~CprocessInfo() //析构函数
{
}
/************************************************************************/
/* 功能:遍历寻找进程
返回值: 进程ID
*/
/************************************************************************/
DWORD CprocessInfo::MyFindProcess(PTCHAR pNameBuffer)
{
//创建一个系统快照,第二个参数如果是模块或者线程的快照,则需要填写该进程的PID,全局返回则填0;
//调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。
//TH32CS_SNAPPROCESS把系统全部进程拍出来
HANDLE hHand = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息)用来 Process32First指向第一个进程信息,并将进程信息抽取到PROCESSENTRY32中。用Process32Next指向下一条进程信息。
PROCESSENTRY32 processInfo = { 0 };
processInfo.dwSize = sizeof(PROCESSENTRY32);//必填项,否则无法区分新旧机器,返回失败
//process32First是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,
//我们可以利用process32First函数来获得第一个进程的句柄。
//返回信息全在processInfo结构体当中
//和Process32Next是一个组合,Process32First觉得去哪拿,Process32Next把其他都拿出来
Process32First(hHand, &processInfo);
//通过一个循环使用Process32Next,把所有进程读取出来
do
{
//通过对比字符串来判断是否当前进程已经获取,szExeFile进程全名;
if (!_tcscmp(pNameBuffer, processInfo.szExeFile))
{
CloseHandle(hHand);//获取的句柄不用一定要关闭,否则会内存泄漏
m_dwPid = processInfo.th32ProcessID;
return m_dwPid;
}
} while (Process32Next(hHand, &processInfo));
CloseHandle(hHand);//获取的句柄不用一定要关闭,否则会内存泄漏
return 0;
}
// Win32Project1.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "Win32Project1.h"
/************************************************************************/
/* 全局变量 */
/************************************************************************/
DWORD g_dwHotKetVule = 0;
CprocessInfo g_ProcessInfo = {};
INT_PTR CALLBACK DialogProc(
HWND hwndDlg,
UINT UMsg,
WPARAM wParam,
LPARAM lParam
);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, DialogProc);
}
/************************************************************************/
/* 命令处理 */
/************************************************************************/
INT_PTR CALLBACK DialogProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG: //窗口初始化
InitDialog(hwnd);
break;
case WM_CLOSE: //窗口关闭处理
EndDialog(hwnd, 0);
return true;
case WM_COMMAND: //命令
switch (LOWORD( wParam))
{
case IDC_BUTTON_BOUND:
BindGameProcess(TEXT("hl2.exe"));
break;
case IDC_BUTTON_VIEW:
break;
case IDC_BUTTON_SPEED:
break;
default:
break;
}
break;
case WM_HOTKEY: //拦截热键消息
OnHotKey(hwnd, wParam, lParam);
break;
default:
break;
}
return FALSE;
}
/************************************************************************/
/* 初始化 */
/************************************************************************/
BOOL InitDialog(HWND hwnd)
{
//注册快捷键 F1
RegisterHotKey(hwnd, 1, 0, VK_F1); //注意这里填写的热键标识符1,判断的时候也是判断标识符
return FALSE;
}
/************************************************************************/
/* 热键处理 */
/************************************************************************/
DWORD OnHotKey(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case 1:
MessageBox(0, TEXT("f1"), 0, 0);
default:
break;
}
return 0;
}
/************************************************************************/
/* 绑定操作 */
/************************************************************************/
VOID BindGameProcess(PTCHAR PNameBuffer)
{
g_ProcessInfo.MyFindProcess(PNameBuffer);
g_ProcessInfo.m_hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, g_ProcessInfo.m_dwPid); //获取PID后返回ID值。<br></br>
}