VC中关于查找进程和关闭进程的问题,高手请进

VC中关于查找进程和关闭进程的问题,高手请进,第1张

系统中的进程,是不断变化的,所以需要先做一个系统快照,然后中这个快照中枚举都有哪些进程。MSDN中给出了很好的例子,你可以通过查看CreateToolhelp32Snapshot函数的资料来得到这个例子。结束进程可以用函数TerminateProcess。

下面是我根据你的需要,对例子中的代码进行了小幅的修改。

BOOL GetProcessList ()

{

HANDLE hProcessSnap = NULL;

BOOL bRet = FALSE;

PROCESSENTRY32 pe32 = {0};

// 做一个系统中当前进程列表的快照

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hProcessSnap == INVALID_HANDLE_VALUE)

return (FALSE);

// 初始化PROCESSENTRY32结构

pe32dwSize = sizeof(PROCESSENTRY32);

// 遍历进程列表,结构体pe32保存了进程的ID,进程名,优先级等信息,你可以利用这个结构来判断是不是你想要 *** 作的进程。

//

if (Process32First(hProcessSnap, &pe32))

{

do

{

//在这里你可以对当前枚举到的进程进行处理,如果是你需要结果的进程,就

//HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, pe32th32ProcessID);

//if(!hProcess)

//TerminateProcess(hProcess);

//来结束进程。

}

while (Process32Next(hProcessSnap, &pe32));

bRet = TRUE;

}

else

bRet = FALSE; // could not walk the list of processes

// Do not forget to clean up the snapshot object

CloseHandle (hProcessSnap);

return (bRet);

}

通过进程名称结束 进程

BOOL FindProcessHandleAndKill(const CString &cs_WndName)

{

HWND hWnd;

DWORD ProcessID;

HANDLE hProcess;

hWnd=::FindWindow(NULL, cs_WndName);

if(hWnd==NULL)//テサモミユメオスエーソレ

{

return FALSE;

}

else

{

if(GetWindowThreadProcessId(hWnd, &ProcessID)==0)//ハァーワ

{

return FALSE;

}

else

{

hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

if(hProcess==NULL)

{

return FALSE;

}

else

{

if(TerminateProcess(hProcess, 0))

{

return TRUE;

}

else

{

return FALSE;

}

}

}

}

}

先用OpenProcess()函数将进程打开后,利用EnumProcessModules()函数枚举该进程的模块,利用GetModuleFileNameEx()函数就能取得该进程的路径

#include <stdioh>

#include <windowsh>

#include "PSAPIH"

#pragma comment( lib, "PSAPILIB" )

int main(void)

{

DWORD processid[1024],needed,processcount,i;

HANDLE hProcess;

HMODULE hModule;

char path[MAX_PATH] = "";

char temp[256];

printf("ShowProcessPath with [Process Status API]/n");

EnumProcesses(processid, sizeof(processid), &needed);

processcount=needed/sizeof(DWORD);

for (i=0;i<processcount;i++)

{

hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);

if (hProcess)

{

EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);

GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));

GetShortPathName(path,path,256);

itoa(processid[i],temp,10);

printf("%s --- %s/n",path,temp);

}

else

{

printf("Failed!!!/n");

}

}

CloseHandle(hProcess);

CloseHandle(hModule);

itoa(processcount,temp,10);

printf("/nProcess Count:%s/n/n",temp);

return 0;

}

VC

获取进程线程数

#include

void

EnumProcess(void)

{

HANDLE

hProcessSnap;

HANDLE

hProcess;

PROCESSENTRY32

pe32;

DWORD

dwPriorityClass;

hProcessSnap

=

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,

0);

if

(hProcessSnap

==

INVALID_HANDLE_VALUE)

{

return;

}

pe32dwSize

=

sizeof(PROCESSENTRY32);

if

(!Process32First(hProcessSnap,

&pe32))

{

CloseHandle(hProcessSnap);

return;

}

do

{

//printf("%s",

pe32szExeFile);

//完整文件名

//printf("%d",

(int)pe32cntThreads);//线程数

}while(Process32Next(hProcessSnap,

&pe32));

CloseHandle(hProcessSnap);

}

如果要获取进程句柄

HANDLE

hProcessHandle;

hProcessHandle

=

OpenProcess(0x1F0FFF,

true,

ProcessID);//ProcessID进程ID

这个在控制台,Win32

SDK

,MFC

都可以用的,只不过

SDK

,MFC

输出就

不用

printf

了,只要把获取的内容赋给变量就行了

#include <windowsh>

#include <stdioh>

#include <tcharh>

#include "psapih"

void PrintProcessNameAndID( DWORD processID )

{

TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

// Get a handle to the process

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ,

FALSE, processID );

// Get the process name

if (NULL != hProcess )

{

HMODULE hMod;

DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),

&cbNeeded) )

{

GetModuleBaseName( hProcess, hMod, szProcessName,

sizeof(szProcessName)/sizeof(TCHAR) );

}

}

// Print the process name and identifier

_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );

CloseHandle( hProcess );

}

void main( )

{

// Get the list of process identifiers

DWORD aProcesses[1024], cbNeeded, cProcesses;

unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )

return;

// Calculate how many process identifiers were returned

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name and process identifier for each process

for ( i = 0; i < cProcesses; i++ )

if( aProcesses[i] != 0 )

PrintProcessNameAndID( aProcesses[i] );

}

这个是MSDN上的例子,里面包括了枚举PID与进程名,你看懂这个例子就什么都知道了。

以上就是关于VC中关于查找进程和关闭进程的问题,高手请进全部的内容,包括:VC中关于查找进程和关闭进程的问题,高手请进、VC 通过进程ID获得主窗口句柄、vc怎样通过进程名获取进程的工作目录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/10148675.html

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

发表评论

登录后才能评论

评论列表(0条)

保存