用vc怎么关闭一个外部程序?

用vc怎么关闭一个外部程序?,第1张

终止指定进程

#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(),在里面作出规定:只有在完成任务后才能退出。

希望能帮到你

关闭自己的程序可以这样的实现:

使用LRESULT SendMessage(

UINT Msg,

WPARAM wParam,

LPARAM lParam

)函数就可以了:SendMessage(WN_CLOSE,0,0)

启动自己的程序使用HINSTANCE ShellExecute(

HWND hwnd,

LPCTSTR lpOperation,

LPCTSTR lpFile,

LPCTSTR lpParameters,

LPCTSTR lpDirectory,

INT nShowCmd

)函数即可。关于每一个参数你可以看看msdn帮助

不过这个函数的位置非常有讲究,要在下面的一个函数当中实现

int CXXXXXApp::ExitInstance()

{

return CWinApp::ExitInstance()

}


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

原文地址: https://outofmemory.cn/yw/12195033.html

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

发表评论

登录后才能评论

评论列表(0条)

保存