一般程式跑到要當不當時,使用者可呼叫工作管理員關閉程式,
而工作管理員開放給 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 如何完成。