读者朋友们可能经常会碰到这样一个问题,想对某些进行操作时,发现这些文件正在被其它程序使用,处于打开状态,而且是被独占打开,这时是没法对文件
进行操作的。因此,要想操作这些文件,必须将打开这些文件的进程清除掉。那么如何干净地清除进程呢?其实,在Windows2000操作系统版本中有一个
工具程序叫tskill.exe,用它就可以清除掉某个程序的进程,在输入"tskill
程序名"后就可以清除其运行实例。但是如何要在代码里实现tskill的功能该如何做呢?针对这一问题,本实例介绍了在Windows2000下实现的方
法。
一、实现方法
在Visual C++编程中,最安全的杀死进程的方法是向运行程序的主窗口发送WM_CLOSE消息,其实现代码如下:
HWND hwnd =this.m_hWnd; // 获得主窗口
PostMessage(hwnd, WM_CLOSE, 0, 0);
发送此消息后,通常应该等待直到进程确实终止,当进程终止时,它发出状态信号,并且 WaitForSingleObject
返回WAIT_OBJECT_0。如果返回别的值,进程要么挂起了,要么仍然在进行处理。在这种情况下,杀死这个进程的唯一方法是用功能更强大的API函
数:TerminateProcess()。如果想干得漂亮一点,可以在关闭之前向主窗口发送一个WM_QUERYENDSESSION消息,当用户结束
会话(log
out)或者调用ExitWindows()函数时,应用程序会收到这个消息,然后准备退出进程,此时一般都会弹出一个确认对话框,告诉用户:"程序要推
出了,如果要保存修改的东西,现在是最佳时机,想保存吗?"有三种选择(Yes/No/Cancel)。此外,发送WM_QUERYENDSESSION
消息可以拒绝推出进程(按下"Cancel键"),如果是这样,进程将会延续。
如果想要关闭的进程被挂起,使用
SendMessageTimeout()函数就非常重要,而不是用SendMessage()函数,其参数
SMTO_NOTIMEOUTIFNOTHUNG是一个只有Windows 2000 和Windows
XP才有的标志。其意义是"如果线程没有挂起,不要超时",换句话说就是如果线程正在进行正常处理,那么永远等待,以便用户能看到对话框并决定做什么,当
用户最终做出决定后,SendMessageTimeout()将带着相应的bOKToKill值返回。
本例为了增强代码的可重用性,将实现细节都封装在一个叫CFindKillProcess的类中,包括查找和杀死进程,详情请参见
EnumProc.h和EnumProc.cpp文件。文件中还有另外两个可重用类,一个是CProcessIterator,另一个是
CWindowIterator。这在实例《获取进程的主窗口以及创建进程的程序名》中有过详细的叙述。
CfindKillProcess类的成员函数FindProcess()查找某个进程序,如果找到这个进程,它返回此进程的ID,然后将此ID传给
CFindKillProcess::KillProcess()函数,KillProcess()函数封装了关闭窗口以及终止逻辑,它利用
CmainWindowIterator类对象来枚举进程的主窗口(可能不止一个,见"如何获取某个进程的主窗口以及创建进程的程序名?"),并发送
WM_CLOSE到每一个窗口,然后等待进程死亡。它有一个布尔型参数用来指示当应用程序进程不愿意退出时是否执行TerminateProcess()
函数。详细细节请参见下载的代码。
二、编程步骤
1、 启动Visual C++6.0,生成一个控制台应用程序,将该程序命名为"kp";
2、 在程序代码中添加CfindKillProcess、CProcessIterator类的定义;
3、 添加代码,编译运行程序。
三、程序代码
四、小结
本实例通过介绍CfindKillProcess类探讨了在Windows2000下彻底消除进程的方法,虽然该程序只能在Windows2000环境下编译运行,但是该方法对Windows98下进程的控制也是有借鉴意义的。
分享到:
相关推荐
用Visual C++干干净净地清除进程
Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual ...
Visual C++源代码 80 如何获取系统指定进程模块信息Visual C++源代码 80 如何获取系统指定进程模块信息Visual C++源代码 80 如何获取系统指定进程模块信息Visual C++源代码 80 如何获取系统指定进程模块信息Visual ...
Visual C++源代码 4 如何在菜单栏中添加文本框Visual C++源代码 4 如何在菜单栏中添加文本框Visual C++源代码 4 如何在菜单栏中添加文本框Visual C++源代码 4 如何在菜单栏中添加文本框Visual C++源代码 4 如何在...
Microsoft Visual C++ 2017 Redistributable Package (x64) 安装在未安装 Visual C++ 2017 的计算机上运行使用 Visual C++ 开发的 64 位应用程序所需的 Visual C++ 库的运行时组件。 此软件包安装 C Runtime (CRT)、...
Microsoft Visual C++微软常用运行库合集 微软常用运行库合集(32+64位合集)包含组件: Visual Basic Virtual Machine(5.1) Visual Basic Virtual Machine(6.0) Microsoft C Runtime Library 2002(7.0.9975.0) ...
Visual C++ Redistributable for Visual Studio 2015 Visual C++ Redistributable for Visual Studio 2015
Visual C++源代码 192 如何使用自动化运行Excel宏Visual C++源代码 192 如何使用自动化运行Excel宏Visual C++源代码 192 如何使用自动化运行Excel宏Visual C++源代码 192 如何使用自动化运行Excel宏Visual C++源代码...
(Visual C++编程 源代码)3.如何终止指定进程?(Visual C++编程 源代码)3.如何终止指定进程?(Visual C++编程 源代码)3.如何终止指定进程?(Visual C++编程 源代码)3.如何终止指定进程?(Visual C++编程 源...
Microsoft Visual C++ 2017 Redistributable Package (x64) 安装在未安装 Visual C++ 2017 的计算机上运行使用 Visual C++ 开发的 64 位应用程序所需的 Visual C++ 库的运行时组件。 此软件包安装 C Runtime (CRT)、...
Microsoft Visual C++ 2013 Redistributable Package运行库,可以在不安装Microsoft Visual C++ 2013的情况下运行需要Microsoft Visual C++ 2013支持的软件、游戏补丁等程序。 同时对于运行程序时,缺少msvcr120....
visual c++ 英文版 下载后安装
Visual C++ 2010 Express//Visual C++ 2010 学习版 离线安装版
(Visual C++编程 源代码)9.如何清除上次登录用户历史记录?(Visual C++编程 源代码)9.如何清除上次登录用户历史记录?(Visual C++编程 源代码)9.如何清除上次登录用户历史记录?(Visual C++编程 源代码)9....
Visual C++源代码 115 如何使用SqlHelper增加数据库记录Visual C++源代码 115 如何使用SqlHelper增加数据库记录Visual C++源代码 115 如何使用SqlHelper增加数据库记录Visual C++源代码 115 如何使用SqlHelper增加...
Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源...
Visual C++6开发使用手册.rar 学习Visual C++6的,可以下来看看,很好.
Visual C++实现进程的创建 操作系统的上机作业
Microsoft Visual C++ 2012 Redistributable Package运行库,可以在不安装Microsoft Visual C++ 2012的情况下运行需要Microsoft Visual C++ 2012支持的软件、游戏补丁等程序。 同时对于运行程序时,缺少msvcr110....