[回目錄]

 

一般程式跑到要當不當時,使用者可呼叫工作管理員關閉程式,

而工作管理員開放給 user 又有兩種模式,

一種是在「應用程式」tab 裡,直接按下「結束工作」即可,

此方式推應可用 SendMessage(hwnd, ... ) 方式進行。

當用此方式關不掉時,可在該應用程式裡按 右鍵->跳到處理程序

跳到「處理程序後」,再按下「結束處理程序」即可。

 

一種方法是用 SendMessage 方式去做,

丟入 SendMessage(hwnd, WM_DESTROY , 0, 0); 

另一種方式是調用 TerimnateProcess ,

以下範例以 Win32 API 方式,關閉某個 process,此處以 excel.exe 為例。

 

/*
 * terminate process
 */
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>

int main()
{
    HANDLE hProcessSnap;
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( hProcessSnap == INVALID_HANDLE_VALUE ) {
        printf("create snapshot fail.\n");
        return EXIT_FAILURE;
    }

    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    if( !Process32First( hProcessSnap, &pe32 ) )  {
        printf("get process fail.\n");
        CloseHandle( hProcessSnap );
        return EXIT_FAILURE;
    }

    do{
        // printf( "PROCESS NAME: %s\n", pe32.szExeFile );

        if(!stricmp("Excel.exe",pe32.szExeFile)){
            // find excel.exe, kill it.
            HANDLE hProcess;
            hProcess = OpenProcess( PROCESS_ALL_ACCESS,
                                    FALSE,
                                    pe32.th32ProcessID );
            if( hProcess == NULL ) printf("open process fail.\n");
            TerminateProcess(hProcess,0);
            WaitForSingleObject(hProcess,INFINITE);
            CloseHandle( hProcess );

            break; // after close, then break
        }
    }while(Process32Next( hProcessSnap, &pe32 ));
    CloseHandle( hProcessSnap );
    return EXIT_SUCCESS;
}

 

其概念並不難,先 polling 目前之所有 processes ,

比對其名稱,再進行關閉,而 polling 所有 processes 之方法也不只一種,

有興趣可看下面兩份程式碼

列舉 process - tlhelp32.h   列舉 process - psapi.h

 

不論是以 hWnd 為主,還是以 hProcess 為主,都將面臨到一問題:

window title (hwnd) / process name (hProcess) 若有重覆時,

沒有一種有效之方法能夠分辨哪種才是我們要關閉的,

像若有 10 個分開的 explore.exe ,沒辦法決定到底要關閉哪個 explore.exe。

 

目前,關閉 process 之方法應還沒有一可攜性之作法,

上述是以 Win32 API 為例,在 windows 底下之命令提示字元可達到同樣之目的

taskkill.exe /im "Excel.exe" /f

有興趣可研究一下 taskkill.exe 裡面帶有哪些參數,思考一下 API 如何完成。

 

[回目錄]

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()