检查所有运行的进程,关闭某个指定的进程

来源:互联网 发布: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 );
        
    }
}
0 0
原创粉丝点击