#include "tlhelp32.h"
void KillExe(const char* szExeName)
{
if (szExeName == NULL)
return 0
int lsr = lstrlen(szExeName)
if (lsr == 0)
return 0
PROCESSENTRY32 my
HANDLE l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if (((int)l) != -1)
{
my.dwSize = sizeof(my)
if (Process32First(l, &my))
{
do
{
if (lstrcmpi(szExeName, my.szExeFile + lstrlen(my.szExeFile) - lsr) == 0)
{
HANDLE hProcessHandle
hProcessHandle = OpenProcess(0x1F0FFF, true, my.th32ProcessID)
if (hProcessHandle != NULL)
{
if (TerminateProcess(hProcessHandle, 0) != NULL)
{
CloseHandle(hProcessHandle)
}
}
CloseHandle(l)
return
}
}while (Process32Next(l, &my))
}
CloseHandle(l)
}
}
调用方式
KillExe("c:\\windows\\notepad.exe")
完整或部分路径名,不区分大小写
首先根据进程名找到该进程的ID,如已知某进程的进程名为Application.exe,可以用列举进程的办法找的该进程的ID(前提是系统中有且只有一个这样的进程):HANDLE hProcessSnap
TCHAR ProcessName[]="Application.exe"
DWORD ProcessID=0x00
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("列举进程失败\n")
return
}
PROCESSENTRY32 pe32
pe32.dwSize = sizeof(pe32)
BOOL bProcess = Process32First(hProcessSnap, &pe32)
TCHAR buff[1024]
while(bProcess)
{
if(strcmp(ProcessName,pe32.szExeFile)==0)
{
ProcessID= pe32.th32ProcessID
break
}
memset(buff, 0x00, 1024)
bProcess=Process32Next(hProcessSnap, &pe32)
}
if(ProcessID==0)
{
printf("没有找到进程%s", ProcessName)
return
}
然后把ProcessID作为参数,按照下面这篇文章所说的方法得到该进程的主窗口句柄:http://www.vckbase.com/document/viewdoc/?id=404
假设得到的句柄为pWnd,然后直接向该窗口发送关闭消息即可:
pWnd->PostMessage(WM_CLOSE)//这种方法是让目标进程自己退出,所以属于安全退出
一般程序会默认处理WM_CLOSE消息,所以当向一个进程的主窗口窗口发送WM_CLOSE消息时就可以关闭该进程,不信你可以试试用下面的代码向任务管理器发送WM_CLOSE消息:
HWND hwnd = ::FindWindow("#32770","Windows 任务管理器")
if(hwnd)
{
::PostMessage(hwnd , WM_CLOSE, 0, 0)
}
要想让被关闭程序在退出之前完成当前任务,则只有在被关闭程序中添加WM_CLOSE的消息函数OnClose(),在里面作出规定:只有在完成任务后才能退出。
希望能帮到你
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)