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

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

终止指定进程

#include "tlhelp32h"

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)

{

mydwSize = sizeof(my);

if (Process32First(l, &my))

{

do

{

if (lstrcmpi(szExeName, myszExeFile + lstrlen(myszExeFile) - lsr) == 0)

{

HANDLE hProcessHandle;

hProcessHandle = OpenProcess(0x1F0FFF, true, myth32ProcessID);

if (hProcessHandle != NULL)

{

if (TerminateProcess(hProcessHandle, 0) != NULL)

{

CloseHandle(hProcessHandle);

}

}

CloseHandle(l);

return;

}

}while (Process32Next(l, &my));

}

CloseHandle(l);

}

}

调用方式

KillExe("c:\\windows\\notepadexe");

完整或部分路径名,不区分大小写

基本思路:

1 用Process32First+Process32Next枚举所有进程。

2 对枚举的进程取程序名,比较是不是要关掉的程序。

3 如是,调用TerminateProcess()结束它。

有的程序一启动就不止一个进程,所以即使关掉一个,也继续枚举。

用法例:kp iexploreexe 关闭IE进程(所有IE浏览器的窗口都关掉)

/

文件名:kpc

程序名:kpexe

用法例:kp iexploreexe

/

#include <windowsh>

#include <tlhelp32h>

int KillMyProcess(char exeName)

{

int rc = 0;

HANDLE hSysSnapshot = NULL;

PROCESSENTRY32 proc;

hSysSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );

if ( hSysSnapshot == (HANDLE)-1 ) return 1;

procdwSize = sizeof(proc);

if ( Process32First ( hSysSnapshot, &proc ) ) {

do {

if (stricmp(procszExeFile, exeName)==0) {

HANDLE Proc_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procth32ProcessID);

if (Proc_handle==NULL || !TerminateProcess(Proc_handle, 0)) rc = 1;

else rc = 0;

}

} while ( Process32Next ( hSysSnapshot, &proc ) );

}

CloseHandle ( hSysSnapshot );

return rc;

}

int main(int argc, char argv[])

{

if (argc>1) {

printf("Kill %s\n", argv[1]);

if (KillMyProcess(argv[1])==0) printf(" --- Process is killed\n");

else printf(" --- Process is not killed \n" ) ;

}

return 0;

}

windows是一个消息机制,

以桌面为父窗口来查找第一个主窗口

hWndPrevious = GetWindow(GetDesktopWindow(),GW_CHILD);

LPTSTR m_pszExeName;

while (IsWindow(hWndPrevious))

{

int i=GetWindowTextLength(hWndPrevious);

GetWindowText(hWndPrevious,szHello,i);//获取窗口标题//这里我的窗口中只有下面几个字是不变的

if (strstr(szHello,"当前用户数:")){

sprintf( szHello1, "Hwnd:%X Title:%s",hWndPrevious,szHello);

TextOut(hdc, rtleft, rttop, szHello1,strlen(szHello1));

break;//匹配,这时hWndPrevious就是所要找的窗口的句柄

}

hWndPrevious = GetWindow(hWndPrevious,GW_HWNDNEXT);

}

获取了信息就可以调用

向运行程序的主窗口发送WM_CLOSE消息。 HWND hwnd = // 获得主窗口

PostMessage(hwnd, WM_CLOSE, 0, 0);

发送此消息后,通常应该等待直到进程确实终止: HANDLE hp = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);

WaitForSingleObject(hp, 5000); // 等待5秒

当进程终止时,它发出状态信号,并且 WaitForSingleObject 返回WAIT_OBJECT_0。如果返回别的值,进程要么挂起了,要么仍然在进行处理。在这种情况下,杀死这个进程的唯一方法是用功能更强大的TerminateProcess: if (WaitForSingleObject(hp, 5000) != WAIT_OBJECT_0)

TerminateProcess(hp,0);

如果想干得漂亮一点,可以在关闭之前向主窗口发送一个WM_QUERYENDSESSION消息。当用户结束会话(log out)或者有人调用ExitWindows时,应用程序会收到这个消息。然后准备即将来临的死亡。此时一般都会d出一个确认对话框,告诉世人:“我要完蛋了,如果要保存修改的东西,现在是最佳时机,想保存吗?”有三种选择(Yes/No/Cancel)。此外,WM_QUERYENDSESSION甚至可以拒绝死亡(按下"Cancel键"),如果是这样,生命将会延续。代码应该这样写: DWORD bOKToKill = FALSE;

SendMessageTimeout(hwnd, WM_QUERYENDSESSION, 0, 0,

SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 100, &bOKToKill);

if (bOKToKill) {

// 发送WM_CLOSE 并等待

}

如果想要关闭的进程被挂起。使用SendMessageTimeout就非常重要,而不是用SendMessage。SMTO_NOTIMEOUTIFNOTHUNG是一个只有Windows 2000 和Windows XP才有的标志。其意义是“如果线程没有挂起,不要超时。”换句话说就是:如果线程正在进行正常处理,那么永远等待,以便用户能看到对话框并决定做什么。当用户最终做出决定后,SendMessageTimeout将带着相应的bOKToKill值返回。所有这些的前提是其它的应用程序运行正常并且WM_QUERYENDSESSION也得到正常处理。

以上就是关于用vc怎么关闭一个外部程序全部的内容,包括:用vc怎么关闭一个外部程序、怎么用C语言结束一个进程求代码、C++怎样强行关闭指定文件的进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9681044.html

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

发表评论

登录后才能评论

评论列表(0条)

保存