2 回答

TA貢獻1834條經驗 獲得超8個贊
windows 系統有一個叫做system hook的技術,用于讓你對系統api做些手腳。
你可以通過注冊一個新的TerminateProcess函數鉤子,當系統調用這個函數時,就會調用你的函數,你的函數可以判斷這個進程是不是你的程序,比如通過窗口的title,class什么的。
如果不是你的窗口,就調用原始的TerminateProcess,如果是你的窗口,就直接return.
另外,你也可以試試重載你的C#程序的WinProc方法,對于WM_CLOSE, WM_DESTORY, WM_QUIT之類的消息進行忽略,只對于自己發出的關閉才正常響應。
上述兩個思路,你選擇吧。代碼沒有功夫寫。
你的那個思路技術上有些問題。

TA貢獻1862條經驗 獲得超6個贊
STARTUPINFO StartupInfo;//定義STARTUPINFO結構指針 memset(&StartupInfo,0,sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOW; PROCESS_INFORMATION ProcessInfo; if (!CreateProcess("D:\\Program Files\\Fluent.Inc\\ntbin\\ntx86\\gambit.exe" , cmdline.GetBuffer(cmdline.GetLength()),NULL,NULL,FALSE,0,NULL,"E:\\zuoye\\gambit1",&StartupInfo,&ProcessInfo)){cout<<"Create Fail!"<<endl;exit(1);}else{cout<<"Success!"<<endl;} WaitForSingleObject(ProcessInfo.hProcess,INFINITE);}void main(){gambit();HANDLE han=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //取進程快照 PROCESSENTRY32 lpp; lpp.dwSize=sizeof(PROCESSENTRY32);BOOL bo;bo=Process32First(han,&lpp); //從快照里取第一個進程信息 TCHAR *str1;while(bo){str1=lpp.szExeFile ; if(!strcmp(str1,"exceed.exe") || !strcmp(str1,"gambit.exe")){HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID); //取進程實例 PROCESS_TERMINATE //cout<<str; TerminateProcess(han2,0); //關閉}bo=Process32Next(han,&lpp); //取下一個進程信息}CloseHandle(han); ------解決方案--------------------------------------------------------TerminateProcess結束進程是不安全的。這個進程最好沒有帶鎖的資源。而你的這個里面好像用到了cout,雖然我不知道這個到底是否有沒有鎖,但是這個cout肯定是互斥的。這樣就有可能導致了結束進程失敗 ------解決方案--------------------------------------------------------先確定有沒有執行到TerminateProcess ------解決方案--------------------------------------------------------既然是windows 平臺, 那就用system 調用相關的 命令吧, system 執行 下面的命令, 絕大部分進程都能結束,方便實用。
- 2 回答
- 0 關注
- 891 瀏覽
添加回答
舉報