線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1670
推到 Plurk!
推到 Facebook!

請問如何關閉一個正在運行的程序

尚未結案
steven_df2008
一般會員


發表:8
回覆:15
積分:4
註冊:2003-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-22 19:08:41 IP:66.98.xxx.xxx 未訂閱
先說明一下,因為被關閉的程序在正常運行時位於sys_tray中, 我使用winSight無法得知它的classname,所以就不能使用 FindWindow得到句柄,無法用SendMessage命令關閉程序,請問 還有什麼方法可以關閉程序嗎? 多來一次KTOP多學一些Delphi
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-23 00:08:36 IP:211.76.xxx.xxx 未訂閱
steven_df2008 您好:    請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43101  有 kill by Program Name 的方法..    
function GetPIDByProgramName(const APName: string): THandle;
var
  isFound: boolean;
  AHandle, AhProcess: THandle;
  ProcessEntry32: TProcessEntry32;
  APath: array[0..MAX_PATH] of char;
begin
  Result := 0;      AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
    isFound := Process32First(AHandle, ProcessEntry32);        while isFound do
    begin          AhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, ProcessEntry32.th32ProcessID);
      GetModuleFileNameEx(AhProcess, 0, @APath[0], sizeof(APath));          if (UpperCase(StrPas(APath)) = UpperCase(APName)) or
        (UpperCase(StrPas(ProcessEntry32.szExeFile)) = UpperCase(APName)) then
      begin
        Result := ProcessEntry32.th32ProcessID;
        break;
      end;          isFound := Process32Next(AHandle, ProcessEntry32);
    end;
  finally
    closeHandle(AHandle);
  end;
end;    function KillProcessByID(APID: THandle): boolean;
var
  AhProcess: THandle;
begin
  // The OpenProcess function returns a handle of an existing process object.
  AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID);
  Result := TerminateProcess(AhProcess, 0);
end;    ...
...    var
  APID: THandle;
begin
  APID := GetPIDByProgramName(Edit4.Text);      if not KillProcessByID(APID) then
    ShowMessage('Can not Kill The Process PID = '   IntToStr(APID));    end;    
希望能對您有幫助 ... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
steven_df2008
一般會員


發表:8
回覆:15
積分:4
註冊:2003-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-23 20:25:21 IP:207.44.xxx.xxx 未訂閱
SouthWind 您好! 我這裡出現如下錯誤提示: [Error] fornet.pas(36): Unsatisfied forward or external declaration: 'TForm1.GetPIDByProgramName' [Error] fornet.pas(37): Unsatisfied forward or external declaration: 'TForm1.KillProcessByID' 看完你的代碼後我不是很清楚,對這每一個函數都還可以看懂, 你是如何想到將CreateToolhelp32Snapshot、Process32First、 OpenProcess、GetModuleFileNameEx、Process32Next、 TerminateProcess這些個api函數聯合起來使用的. 煩請告之,Thanks! 多來一次KTOP多學一些Delphi
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-24 09:11:59 IP:203.66.xxx.xxx 未訂閱
引言: SouthWind 您好! 我這裡出現如下錯誤提示: [Error] fornet.pas(36): Unsatisfied forward or external declaration: 'TForm1.GetPIDByProgramName' [Error] fornet.pas(37): Unsatisfied forward or external declaration: 'TForm1.KillProcessByID' 看完你的代碼後我不是很清楚,對這每一個函數都還可以看懂, 你是如何想到將CreateToolhelp32Snapshot、Process32First、 OpenProcess、GetModuleFileNameEx、Process32Next、 TerminateProcess這些個api函數聯合起來使用的. 煩請告之,Thanks! 多來一次KTOP多學一些Delphi
可能是您在 implementation 區段的 Code 拼字有誤... 檢查一下 宣告 與 implementation 是否名稱一致?? 至於 CreateToolhelp32Snapshot、Process32First、 OpenProcess、GetModuleFileNameEx、Process32Next、 TerminateProcess 會想到這些 Windows API 的使用,起因是站內的某篇討論, 內容是討論如何找到特定的 Process ,FindWindow 應該是 最簡單好用的,但是對於不是 Window ,沒有或重複 Title 的 Window 並不方便,所以另有一解法是透過 Process 下手... 說起來很汗顏,我第一次看到那些文章的時候,程式碼根本看不懂.. 後來是去讀了 Matt Pietrek 的 "歷史書" Windows 95 System Programming SECRETS,才對 Windows 系統底層的基本運作有些了解.. 看完後才看懂 (很奇怪,我有了觀念後,程式碼豁然開朗) 其實寫到現在,覺得 Programmer 難避免要跟 Windows API 打交道, Delphi RAD 帶來莫大的便利,卻隱藏了許多複雜的動作, RAD 無原罪, 也不用閉門造車堅持全 SDK 手工打造,有作業系統架構的觀念,加上熟練的 Programming 技巧,才能隨心所欲打造自己的想要的程式... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
steven_df2008
一般會員


發表:8
回覆:15
積分:4
註冊:2003-10-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-24 21:33:20 IP:66.98.xxx.xxx 未訂閱
function TForm1.KillProcessByID(APID: THandle):boolean; var AhProcess: THandle; begin // The OpenProcess function returns a handle of an existing process object. AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID); Result := TerminateProcess(AhProcess, 0); end; 我在書寫時少了紅色部分所以報錯了> 這兩個function通過調試跟蹤,加上一邊看Delphi中的幫助基本看懂了. 您說的那本書我也已經download下來了會仔細看的! 我也會經常來KTOP的,有問題還請您多幫忙. 多來一次
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-25 15:21:40 IP:203.66.xxx.xxx 未訂閱
引言: function TForm1.KillProcessByID(APID: THandle):boolean; var AhProcess: THandle; begin // The OpenProcess function returns a handle of an existing process object. AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID); Result := TerminateProcess(AhProcess, 0); end; 我在書寫時少了紅色部分所以報錯了> 這兩個function通過調試跟蹤,加上一邊看Delphi中的幫助基本看懂了. 您說的那本書我也已經download下來了會仔細看的! 我也會經常來KTOP的,有問題還請您多幫忙. 多來一次>< face="Verdana, Arial, Helvetica"> 您客氣了,剛好您的問題我有注意過而已,我還蠻喜歡討論的,這樣比較快 知道自己的缺點 ... 在站上有時候自己實力不夠,回答別人的問題也是挺好笑的,事後看了正解, 才發現自己有多蠢... PS. Matt 的書有得 download,這種好康的要告訴我一下了,我花了 700 大洋 去圖書館印的 ... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
steven_df2008
一般會員


發表:8
回覆:15
積分:4
註冊:2003-10-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-25 19:53:46 IP:210.192.xxx.xxx 未訂閱
不會吧您花了700 大洋,RMB也有170左右!It's too expensive    我也是最近剛上這兒來的所以是新人一個啊,還請您多多指教.    您是programmer嗎?我是個學計算機的,寫程序嗎真的不咱樣, 現在工作以后(生技工程師)學編程的時間更少了,公司(台資公 司)里對我們的電腦做了限制所以一直不可以上網,不過現在 我通過國外的代理服務器終于可以上了,因為要通過外部代理 所以嗎速度真的有點讓人受不了.    好,就這樣吧!    話不多說,讓我們一起在KTOP學習~~進步~~再學習! 多來一次
系統時間:2024-06-27 3:05:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!