mfc 获取系统进程的过程

mfc 获取系统进程的过程,第1张

获取系统进程要使用CreateToolhelp32Snapshot()函数得到快照,然后进行遍历,取出自己想要的信息就可以了。下面是我自己写的一个由进程名称得到进程ID的函数,要得到所有的进程,你只要把循环进行完就行。上代码:

DWORD CXXXDlg::GetProeccIDByName(CString& csProName)

{

//AddOutPut()是我自己封装的调试函数,可以不用理会

//使用CreateToolhelp32Snapshot()等函数要包含头文件

//#include <TlHelp32h>

 AddOutPut(_T("->由进程名字得到进程ID开始"));

 if (csProNameIsEmpty())

 {

  AddOutPut(_T("!!由进程名字得到进程ID失败,进程ID名字为空!"));

  return 0;

 }

 HANDLE hSnapShot = NULL;

 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 if (INVALID_HANDLE_VALUE == hSnapShot)

 {

  AddOutPut(_T("!!由进程名字得到进程ID失败,创建快照失败!"));

  return 0;

 }

 int nPos = csProNameReverseFind('\\');

 csProName = csProNameRight(csProNameGetLength() - nPos);

 PROCESSENTRY32 proEntry32 = {0};

 bool bRetval = false;

 bool bFind = false;

 proEntry32dwSize = sizeof(PROCESSENTRY32);

 bRetval = Process32First(hSnapShot, &proEntry32)  true : false;

 while (bRetval)

 {

  if (0 == StrCmpI(proEntry32szExeFile, csProName))

  {

   bFind = true;

   break;

  }

  bRetval = Process32Next(hSnapShot, &proEntry32)  true : false;

  proEntry32dwSize = sizeof(PROCESSENTRY32);

 }

 if (!bFind)

 {

  AddOutPut(_T("!!由进程名字得到进程ID失败,未找到该进程!"));

  return 0;

 }

 if (hSnapShot != NULL)

 {

  CloseHandle(hSnapShot);

 }

 AddOutPut(_T("->由进程名字得到进程ID成功"));

 return proEntry32th32ProcessID;

}

方法一:调用ActivityManager

代码如下

ActivityManager am = (ActivityManager) this

                getSystemService(ContextACTIVITY_SERVICE);

List<RunningAppProcessInfo> list = _amgetRunningAppProcesses();

for (int i = 0; i < listsize(); i++) {

      Logi("tag", listget(i)pid);

}

方法二:调用Process类获取

只需要一句代码即可

int pid = androidosProcessmyPid();

还可以使用androidosProcessmyTid()获取调用进程的线程ID

和androidosProcessmyUid():获取该进程的用户ID

取进程信息 要使用应用接口支持库 或者用API 我给你贴个例子 你可以加我QQ我给你源码

源码中需要超级列表框的支持

版本 2

支持库 eAPI

支持库 iext

局部变量 进程组, 进程信息, , "0"

局部变量 局部计次, 整数型

超级列表框1全部删除 ()

进程组 = 取系统进程列表 ()

计次循环首 (取数组下标 (进程组, ), 局部计次)

超级列表框1插入表项 (, , , , , )

超级列表框1置标题 (局部计次 - 1, 0, 到文本 (进程组 [局部计次]进程标识符))

超级列表框1置标题 (局部计次 - 1, 1, 到文本 (进程组 [局部计次]进程名称))

超级列表框1置标题 (局部计次 - 1, 2, 到文本 (进程组 [局部计次]父进程标识符))

超级列表框1置标题 (局部计次 - 1, 3, 到文本 (进程组 [局部计次]线程数))

计次循环尾 ()

#include <windowsh>

#include <Tlhelp32h>

#include <stdioh>

int main()

{

//定义进程信息结构

PROCESSENTRY32 pe32;

pe32dwSize = sizeof(PROCESSENTRY32);

HANDLE hProcessShot;

hProcessShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获取进程列表,最后一个参数是0

if (hProcessShot == INVALID_HANDLE_VALUE)

{

puts("获取进程列表失败");

return 0;

}

// 创建系统当前进程快照

if (Process32First(hProcessShot,&pe32))//获取下一个进程快照

{

for (int i = 0;Process32Next(hProcessShot, &pe32);i++)

{

printf("%d : %-20s ",i, pe32szExeFile);

TCHAR szStrTemp[50];

wsprintf(szStrTemp,"PID : %d", pe32th32ProcessID);

printf("%-20s ", szStrTemp);

wsprintf(szStrTemp,"cntThreads : %d",pe32cntThreads);

printf("%-20s \n",szStrTemp);

}

}

//遍历进程快照

CloseHandle(hProcessShot);

return 0;

}

这样就行了,直接复制到你的控制台程序试试

用命令的方式也是很方便将结果存到变量里呀,用一个复制或者重定向就行了。

c代码:

#include <pthreadh>

#include <stdioh>

void print_xs (void unused)

{

while (1)

fputc (‘x’, stderr);

return NULL;

}

/ The main program /

int main ()

{

int i=0;

while(1){

pthread_t thread_id;

if( NULL != pthread_create (&thread_id, NULL, &print_xs, NULL)){

break;

}

i++;

}

printf("创建线程个数:%d\n",i);

return 0;

}

要想获取进程的用户名和账号,应首先调用OpenProcessToken打开进程的令牌(Token),打开方式设为TOKEN_QUERY,然后将TOKEN_INFORMATION_CLASS设为 TokenUser调用GetTokenInformation枚举进程的令牌信息块SID,通常称为安全标识(Security Identifier),最后调用LookupAccountSid从SID中检索用户名和账号。

char buf[256], szUser[128], szComputer[128];

HANDLE hProcess, hToken;

DWORD cbUser, cbComputer;

SID_NAME_USE snu;

if(ProcessID <= 0x0c)

显示用户名为"SYSTEM";

Else

显示用户名为"SERVICE ";

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessID);

OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);

GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);

cbComputer=sizeof(szComputer);

LookupAccountSid(NULL, (DWORD )((DWORD )buf), szUser,

&cbUser, szComputer, &cbComputer, &snu);

CloseHandle(hToken);

CloseHandle(hProcess);

示例里,已经把所有进程相关信息保存在ll_processes[]数组里

进程名字列表在lb_1里

知道进程名字,调用

ll_hprocess = OpenProcess(PROCESS_ALL_ACCESS, 0, ll_processes[ll_index])

可以得到你进程的句柄

然后:

OpenProcessToken(ll_hprocess , TOKEN_QUERY, &hToken);

GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);

cbComputer=sizeof(szComputer);

LookupAccountSid(NULL, (DWORD )((DWORD )buf), szUser, &cbUser, szComputer, &cbComputer, &snu);

则 用户名和账号分别到存放变量szUser和szComputer中。

OpenProcessToken GetTokenInformation LookupAccountSid 我只找到了函数原型,没有找到如何在PB中声明。

-----------------

BOOL OpenProcessToken( __in HANDLE ProcessHandle, //要修改访问权限的进程句柄 __in DWORD DesiredAccess, //指定你要进行的 *** 作类型 __out PHANDLE TokenHandle //返回的访问令牌指针 );

BOOL WINAPI GetTokenInformation(

__in HANDLE TokenHandle,

__in TOKEN_INFORMATION_CLASS TokenInformationClass,

__out_opt LPVOID TokenInformation,

__in DWORD TokenInformationLength,

__out PDWORD ReturnLength

);

别名:LookupAccountSidA

库名:advapi32dll

说明:

返回值:

实例:

参数表:

声明:Declare Function LookupAccountSid Lib "advapi32dll" Alias "LookupAccountSidW" (ByVal lpSystemName As Any, Sid As Any, Name As Any, cbName As Long, ReferencedDomainName As Any, cbReferencedDomainName As Long, peUse As Integer) As Long

以上就是关于mfc 获取系统进程的过程全部的内容,包括:mfc 获取系统进程的过程、如何在Android中取得当前进程名、易语言打开一个程序并获取进程pid等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10037716.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存