/*
检查所有运行的进程,关闭某个指定的进程
====================说明================================
前台进程:桌面上可以看到的窗口进程
后台进程:桌面没有窗口与之对应,但是在任务管理器中可以看到
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 );
}
}