主要过程:
1.由进程命获取PID,进程名要带exe;
2.利用OpenProcess函数获得进程句柄,需要参数PID,调用此函数的第一个参数应包含PROCESS_TERMINATE,否则TerminateProcess执行会没有权限,还应包含SYNCHRONIZE,否则WaitForSingleObject执行会没有权限;
3.利用TerminateProcess和WaitForSingleObject终止进程,只用TerminateProcess也可心,但拒说可能会导致内存泄漏。
代码如下:
#include "stdafx.h"
#include <windows.h>
#include "psapi.h"
#pragma comment(lib,"psapi.lib")
DWORD GetProcessID(wchar_t *ProcessName) //由进程名获取PID
{
DWORD aProcesses[100], cbNeeded, cProcesses;
unsigned int i;
HANDLE hProcess;
HMODULE hMod;
wchar_t szProcessName[100] ;
if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
return 0;
cProcesses = cbNeeded / sizeof(DWORD);
for(i=0;i<cProcesses;i++)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, aProcesses[i]);
if(hProcess)
{
if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&cbNeeded))
{
GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
if(!_wcsicmp(szProcessName,ProcessName))
{
CloseHandle( hProcess );
return aProcesses[i];
}
}
}
}
CloseHandle( hProcess );
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD pID;
wchar_t name[50]=L"key.exe";
pID=GetProcessID(name);
if(!pID)//Processisnotrunning
MessageBox(NULL,L"Process is not running",L"Information",MB_OK);
else//Processisrunning
{
wchar_t szText[256];
DWORD wRet;
wsprintf(szText,L"ProcessID of %ws is %d\n",name,pID);
MessageBox(NULL,szText,L"Information",MB_OK);
HANDLE hProcess=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE ,FALSE,pID);
if(hProcess==NULL){printf("openprocess fail\n");getchar();return 0;}
if(TerminateProcess(hProcess,0))
printf("suc\n");
else
printf("fail\n");
wRet=WaitForSingleObject(hProcess,INFINITE);
if (wRet == WAIT_OBJECT_0)
printf("Process is signaled...\n");
else if (wRet == WAIT_TIMEOUT)
printf("Time out...\n");
else if (wRet == WAIT_ABANDONED)
printf("Object is a mutex object...\n");
else if (wRet == WAIT_FAILED)
printf("Call failed ,GetLastError()=%d\n",GetLastError());
CloseHandle(hProcess);
}
getchar();
return 1;
}