检查所有运行的进程,关闭某个指定的进程
来源:互联网 发布:windows找不到null文件 编辑:程序博客网 时间:2024/04/30 13:19
/*
检查所有运行的进程,关闭某个指定的进程
====================说明================================
前台进程:桌面上可以看到的窗口进程
后台进程:桌面没有窗口与之对应,但是在任务管理器中可以看到
winword.exe:打开word,就会有这个进程运行
// 本工程是VC工程,在VS2005下基于对话框的程序。
// 完成功能:询问用户是否关闭打开的word文件,之后再检测一下任务管理器中是否还有WINWORD.EXE进程
在运行,有则强制关闭。
*/
#include <psapi.h> // 使用EnumProcesses,得包含次文件
#pragma comment(lib,"psapi.lib")
// 前台与后台检测winword.exe进程
void CshareFileDlg::OnBnClickedButtonShare()
{
// 结束前台与后台进程
CString strWordWindow ;
CString strWordProcess ;
strWordWindow = TEXT( " - Microsoft Word" );
strWordProcess = TEXT( "WINWORD.EXE" );
EndProcess( strWordWindow , strWordProcess );
}
// 结束前台与后台进程
void CshareFileDlg::EndProcess( const CString &strWordWindow , const CString &strWordProcess )
{
HWND hwndDesk ;
HWND hwndAll ;
LPWSTR lpwstr ;
CString strTitle ;
CString strText ;
DWORD aProcesses[1024] ;
DWORD cbNeeded ;
DWORD cProcesses ;
DWORD i ;
HANDLE hProcess ;
DWORD dwProcessID ;
TCHAR szProcessName[MAX_PATH] ;
//LPWSTR lpwProcessName ;
CString strProcessName ;
DWORD ExitCode ;
lpwstr = NULL ;
lpwstr = new WCHAR[256] ;
//----------------------------------------------------------------------------
// 前台检测
hwndDesk = ::GetDesktopWindow(); // 得到桌面窗口句柄
hwndAll = ::GetWindow( hwndDesk , GW_CHILD );// 得到桌面窗口的子窗口句柄
// 当存在子窗口
while( TRUE ){
if ( NULL != hwndAll ){
// 得到子窗口的标题
::GetWindowText( hwndAll , lpwstr , 256);
strTitle = (LPCTSTR)lpwstr;
// 判断是否存在打开的word文档,是则显示此word文档的标题,问用户是否关闭
if ( -1 != strTitle.Find( strWordWindow )){
strText.Format( TEXT( "有word在运行,标题为/"%s/",您是否关闭此word文档?" ) , strTitle );
// 如果用户选择yes,则提醒用户只有关闭word后本应用程序才能继续运行
if ( IDYES == AfxMessageBox( strText , MB_YESNO )){
AfxMessageBox( TEXT( "请您立即关闭打开的word文档,只有关闭word后本应用程序才能继续运行" ) );
continue;
} else {
return;
}
}
} else {
break;
}
// 得到下一个桌面子窗口
hwndAll = ::GetWindow( hwndAll , GW_HWNDNEXT );
}
//-------------------------------------------------------------------------------
// 后台检测
//lpwProcessName = new WCHAR[MAX_PATH];
memset( szProcessName , 0 , sizeof(TCHAR) );
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ){
return;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// 判断是否有进程“WINWORD.EXE”存在
for ( i = 0; i < cProcesses; i++ ){
dwProcessID = aProcesses[i];
// 得到进程句柄
hProcess = OpenProcess( PROCESS_ALL_ACCESS , FALSE , dwProcessID );
if ( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
// 得到进程名
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName) );
}
strProcessName = (LPCTSTR)szProcessName;
// 若存在WINWORD.EXE进程,则强行关闭
if( 0 == strProcessName.CompareNoCase( strWordProcess ) ){
// 判断进程号是否结束,得到进程的终止状态
if( GetExitCodeProcess ( hProcess , &ExitCode) ){
// 若进程未被终止,结束进程
TerminateProcess( hProcess , ExitCode);
}
}
}
// 关闭进程
CloseHandle( hProcess );
}
}
检查所有运行的进程,关闭某个指定的进程
====================说明================================
前台进程:桌面上可以看到的窗口进程
后台进程:桌面没有窗口与之对应,但是在任务管理器中可以看到
winword.exe:打开word,就会有这个进程运行
// 本工程是VC工程,在VS2005下基于对话框的程序。
// 完成功能:询问用户是否关闭打开的word文件,之后再检测一下任务管理器中是否还有WINWORD.EXE进程
在运行,有则强制关闭。
*/
#include <psapi.h> // 使用EnumProcesses,得包含次文件
#pragma comment(lib,"psapi.lib")
// 前台与后台检测winword.exe进程
void CshareFileDlg::OnBnClickedButtonShare()
{
// 结束前台与后台进程
CString strWordWindow ;
CString strWordProcess ;
strWordWindow = TEXT( " - Microsoft Word" );
strWordProcess = TEXT( "WINWORD.EXE" );
EndProcess( strWordWindow , strWordProcess );
}
// 结束前台与后台进程
void CshareFileDlg::EndProcess( const CString &strWordWindow , const CString &strWordProcess )
{
HWND hwndDesk ;
HWND hwndAll ;
LPWSTR lpwstr ;
CString strTitle ;
CString strText ;
DWORD aProcesses[1024] ;
DWORD cbNeeded ;
DWORD cProcesses ;
DWORD i ;
HANDLE hProcess ;
DWORD dwProcessID ;
TCHAR szProcessName[MAX_PATH] ;
//LPWSTR lpwProcessName ;
CString strProcessName ;
DWORD ExitCode ;
lpwstr = NULL ;
lpwstr = new WCHAR[256] ;
//----------------------------------------------------------------------------
// 前台检测
hwndDesk = ::GetDesktopWindow(); // 得到桌面窗口句柄
hwndAll = ::GetWindow( hwndDesk , GW_CHILD );// 得到桌面窗口的子窗口句柄
// 当存在子窗口
while( TRUE ){
if ( NULL != hwndAll ){
// 得到子窗口的标题
::GetWindowText( hwndAll , lpwstr , 256);
strTitle = (LPCTSTR)lpwstr;
// 判断是否存在打开的word文档,是则显示此word文档的标题,问用户是否关闭
if ( -1 != strTitle.Find( strWordWindow )){
strText.Format( TEXT( "有word在运行,标题为/"%s/",您是否关闭此word文档?" ) , strTitle );
// 如果用户选择yes,则提醒用户只有关闭word后本应用程序才能继续运行
if ( IDYES == AfxMessageBox( strText , MB_YESNO )){
AfxMessageBox( TEXT( "请您立即关闭打开的word文档,只有关闭word后本应用程序才能继续运行" ) );
continue;
} else {
return;
}
}
} else {
break;
}
// 得到下一个桌面子窗口
hwndAll = ::GetWindow( hwndAll , GW_HWNDNEXT );
}
//-------------------------------------------------------------------------------
// 后台检测
//lpwProcessName = new WCHAR[MAX_PATH];
memset( szProcessName , 0 , sizeof(TCHAR) );
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ){
return;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// 判断是否有进程“WINWORD.EXE”存在
for ( i = 0; i < cProcesses; i++ ){
dwProcessID = aProcesses[i];
// 得到进程句柄
hProcess = OpenProcess( PROCESS_ALL_ACCESS , FALSE , dwProcessID );
if ( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
// 得到进程名
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName) );
}
strProcessName = (LPCTSTR)szProcessName;
// 若存在WINWORD.EXE进程,则强行关闭
if( 0 == strProcessName.CompareNoCase( strWordProcess ) ){
// 判断进程号是否结束,得到进程的终止状态
if( GetExitCodeProcess ( hProcess , &ExitCode) ){
// 若进程未被终止,结束进程
TerminateProcess( hProcess , ExitCode);
}
}
}
// 关闭进程
CloseHandle( hProcess );
}
}
0 0
- 检查所有运行的进程,关闭某个指定的进程
- 检查所有运行的进程,关闭某个指定的进程
- 指定某个cpu只运行指定进程的做法
- 指定某个cpu只运行指定进程的做法
- C#强制关闭含QQ的所有进程,强制关闭最近打开的某个进程
- 关闭指定进程的方法
- 关闭指定应用的进程
- 关闭指定端口的进程
- 关闭所有的ArcGISSever进程
- 指定进程运行的CPU
- 关闭使用某个DLL的进程
- cmd 关闭某个占用的进程
- 枚举系统内所有的运行进程以及杀死指定进程的方法
- 查找某个进程拥有的所有窗口
- 如何结束某个名字的所有进程?
- 查找某个进程拥有的所有窗口
- Linux 杀死某个用户的所有进程
- C#得到系统进程和结束某个指定的进程
- 浅析 Linux 中的时间编程和实现原理,第 3 部分: Linux 内核的工作
- 数据库的基本操作
- [leetcode-116]Populating Next Right Pointers in Each Node(c++)
- Redis-2.8.17安装配置过程和一些错误
- 多重虚继承的内存模型分析
- 检查所有运行的进程,关闭某个指定的进程
- 表的基本操作
- Java 多线程
- HDU 5241 Friends
- 360在线笔试题:挑选镇长
- Java中的引用传递及其使用
- 后缀数组模板
- position relative 与 js 原生动画 浏览器兼容问题
- strlen和sizeof的区别