遍历进程链表找到游戏进程

为了省去自己注册窗口类,创建窗口类可以直接使用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值。
}

原文地址:https://www.cnblogs.com/hanhandaren/p/11079211.html

时间: 2024-10-11 20:23:28

遍历进程链表找到游戏进程的相关文章

【算法题】一次遍历单向链表找到中间节点

在阅读的过程中有任何问题,欢迎一起交流 邮箱:[email protected]    QQ:1494713801 具体方法和思想: 1)设置2个指针,一个走2步时,另一个走1步: 2)那么一个走到头时,另一个走到中间. iNode * GetMiddleNode ( iNode *head ) { iNode *p1 = head; iNode *p2 = p1; while( p2 ) { p2 = p2->next; if(p2!=NULL) { p2 = p2->next; p1=p1

遍历PspCidTable表检测隐藏进程

一.PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程线程对象,其索引就是PID和TID. 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER). 3.PspCidTable是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来.注意访问对象时要掩

linux内核调度算法(1)--快速找到最高优先级进程

为什么要了解内核的调度策略呢?呵呵,因为它值得我们学习,不算是废话吧.内核调度程序很先进很强大,管理你的LINUX上跑的大量的乱七八糟的进程,同时还保持着对用户操作的高灵敏响应,如果可能,为什么不把这种思想放到自己的应用程序里呢?或者,有没有可能更好的实现自己的应用,使得操作系统能够以自己的意志来分配资源给自己的进程? 带着这两个问题来看看KERNEL.首先回顾上我们开发应用程序,基本上就两种类型,1.IO消耗型:比如hadoop上的trunk服务,很明显它的消耗主要在IO上,包括网络IO磁盘I

通过进程id找到进程对应的容器并统计每个进程的内存占用写到excel里

1 # coding=utf-8 2 import re 3 import os 4 import commands 5 import json 6 import psutil 7 from pyExcelerator import * 8 9 10 def execute(cmd): 11 status, output = commands.getstatusoutput(cmd) 12 if status != 0: 13 raise Exception('status is %s, out

[linux]进程(二)--进程地址空间

7,linux进程命名空间的概念 关于命名空间具体可以参考深入linux内核架构2.3.2章节 linux的命名空间属于操作系统级虚拟化,各个命名空间互相隔离,互相不可见,不同命名空间的进程PID可以相同,因此从操作系统层面看可能有相同的uid和pid,父命名空间同时还可以包含子命名空间,子命名空间不知道父命名空间的存在,但是父命名空间知道子命名空间的存在. 命名空间的实现:为了task_struct的精简,内核引入了struct nsproxy来统一管理进程所属的命名空间,在task_stru

进程的描述和进程的创建——第六周(20135304刘世鹏)

进程的描述和进程的创建  作者:刘世鹏20135304                                                                                       <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  一.进程的描述 1.1进程描述符task_struck数据结构(一) (1)操作系统的三大功能:进程管理.内存管理.文件系统. (2)

Linux进程ID号--Linux进程的管理与调度(三)

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux-进程管理与调度 Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结构在内核文件include/linux/sched.h中定义,在目前最新的Linux-4.5(截至目前的

20135239益西拉姆 Linux内核分析 进程的描述和进程的创建

[益西拉姆 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 第六周 进程的描述和进程的创建 一. 进程的描述 进程控制块PCB——task_struct 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct数据结构很庞大 Linux进程的状态与操作系统原理中的描述的进程状态似乎有所不同,比如就绪状态和运行状态都是

使用wincc vbs脚本查找进程及如何运行进程

使用vbs代码查看某个进程是否在运行,本文要检查的进程名为 QRscan.exe,其代码如下: sub CheckProcess Dim WMI,Objs,Process,ObjSet WMI=GetObject("WinMgmts:")Set Objs=WMI.InstancesOf("Win32_Process")Process="" '遍历所有在运行的进程For Each Obj In Objs'Process=Process &