如何根据进程名字结束进程

结束一个进程,一般有两种情况:一种是有界面的,一种是没有界面的。

结束有界面的进程的思想就是:通过FindWindow查找到窗口,然后根据窗口获取进程id,然后就直接看代码:

//结束进程
BOOL KillProcess(LPCTSTR pszClassName, LPCTSTR pszWindowTitle)
{
	HANDLE hProcessHandle;
	ULONG nProcessID;
	HWND TheWindow;
	TheWindow = ::FindWindow( /*pszClassName*/NULL, pszWindowTitle );
	::GetWindowThreadProcessId( TheWindow, &nProcessID );
	hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE, nProcessID );
	return ::TerminateProcess( hProcessHandle, 2 );
}

具体可以参考:http://blog.csdn.net/iamduoluo/article/details/6676908


如果是根据进程名字结束进程,结束系统进程模块的代码是用系统快照的原理得到进程的句柄,然后用TerminateProcess的方法结束掉进程的:

// killprocess_test.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <Tlhelp32.h>
#include <algorithm>
#include <vector>

//
void kill(int pid)
{
	HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
	BOOL bOkey = TerminateProcess(hProcess, 0);
	if(bOkey)
	{
		WaitForSingleObject(hProcess, 1000);
		CloseHandle(hProcess);
		hProcess = NULL;
	}
}
//
void TerminateProcessByName(PCWSTR name)
{
	DWORD pid = 0;

	// Create toolhelp snapshot.
	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32W process;
	ZeroMemory(&process, sizeof(process));
	process.dwSize = sizeof(process);

	std::vector<DWORD> pids;
	// Walkthrough all processes.
	if (Process32FirstW(snapshot, &process))
	{
		do
		{
			// Compare process.szExeFile based on format of name, i.e., trim file path
			// trim .exe if necessary, etc.
			std::wstring szExeFile = process.szExeFile;
			std::wstring szName = name;
			/*std::transform(szExeFile.begin(), szExeFile.end(), szExeFile.begin(), towlower);
			std::transform(szName.begin(), szName.end(), szName.begin(), towlower);*/

			if (!wcscmp(szExeFile.c_str(), szName.c_str()))
			{
				pid = process.th32ProcessID;
				pids.push_back(pid);
			}
		} while (Process32NextW(snapshot, &process));
	}

	CloseHandle(snapshot);

	size_t size = pids.size();
	for(size_t i = 0; i < size; ++i)
	{
		kill(pids[i]);
	}
}

//
int main()
{
	printf("this is test for kill process\n");

	//注意区分大小写
	TerminateProcessByName(L"KuGou.exe");

	system("pause");

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值