全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1868
推到 Plurk!
推到 Facebook!

如何偵測程式正在執行

尚未結案
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-19 16:28:12 IP:218.208.xxx.xxx 未訂閱
各位好,有個問題想請教大家 比如: 我有一個程式 project1.exe ,copy 在不同的folder , 然後同時開啟. 但我要怎樣才知道那個資料夾的程式正在執行,那個資料夾的程式沒有執行. ================================================ 用以下的 Function 寫, return 回來的都是 True 值 ================================================ Function ApplicationUse(fName : String ) : Boolean; var HFileRes : HFILE; begin Result := false; if not FileExists(fName) then exit; HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); if not Result then CloseHandle(HFileRes); end; ================================================ 用以下的 Function 寫, 只能取到一個 exe 的值 ================================================ Function IsExecute(FileName : String) : Boolean; var MyWnd : Thandle; begin MyWnd := FindWindow(nil, pchar(FileName)); Result := MyWnd<>0; end; 我的目的,只是要知道那些程式沒有執行,就用CheckBox 打勾開啟它, 如果想把那些正在執行的程式關掉 , 用 unCheck 把它結束掉. 故請大家幫忙,告訴我如何解決這樣的問題 謝謝
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-19 22:21:41 IP:221.226.xxx.xxx 未訂閱
两种方法,一种通过窗口的标题文字判断,第二种列举系统中的进程,然后对比可执行文件路径名称。    第一种方法较简单
function AppIsRun(sAppTitle:String):Boolean;
var 
    PrevInstHandle:Thandle;
    pAppTitle:pchar;
begin
    AppTitle := pchar(sAppTitle);
    PrevInstHandle := FindWindow(nil, AppTitle);
    Result := PrevInstHandle <> 0;
end;
第二种列举系统进程的由于手上本本没DELPHI就没写,如果上面方法不够用留个言,回去了我再把代码写给你。
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-21 16:33:14 IP:61.221.xxx.xxx 未訂閱
hihi 這類文章應不算少的QQ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33946 http://delphi.ktop.com.tw/topic.php?topic_id=43101 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20777 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42980 搞不懂!搞不懂!永遠都搞不懂!!
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-21 20:43:07 IP:211.74.xxx.xxx 未訂閱
再提供一個方法!! begin i:=FileOpen(FileName,fmOpenReadWrite); //檔案開啟時,無法寫入!! if(i=-1)then Showmessage('檔案使用中..'); FileClose(i); end; 發表人 - jest0024 於 2005/03/21 20:46:05
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-21 20:43:31 IP:211.74.xxx.xxx 未訂閱
多按了一下,真不好意思~>"< 發表人 - jest0024 於 2005/03/21 20:46:46
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-22 15:25:49 IP:219.93.xxx.xxx 未訂閱
謝謝大家的熱情幫助 Vicen 的方式基本上與這個方式沒甚麼差別 , 可否給我參考您的第二種方式 ================================================ 用以下的 Function 寫, 只能取到一個 exe 的值 ================================================ Function IsExecute(FileName : String) : Boolean; var MyWnd : Thandle; begin MyWnd := FindWindow(nil, pchar(FileName)); Result := MyWnd<>0; end; mine 提供的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33946 不管同樣的 exe 開多少個 , 每次只會拿到最後一次開啟的. 因此不能任意關閉想要關的 Exe 但我還是真誠的感謝大家提供的意見 , 希望各位能再給我更多寶貴的意見.
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-23 13:35:37 IP:61.221.xxx.xxx 未訂閱
HIHi 我想可能你沒仔細看 不過應該是可行的 借大大的範例修了一下你參考一下
rocedure TForm1.Button1Click(Sender: TObject);
var
  Found: Boolean;
  j,AProcessID: DWORD;
  AWnd, AHandle: THandle;
  ProcessEntry32: TProcessEntry32;
  APath: array [0..MAX_PATH] of Char;    begin
  AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
    Found := Process32First(AHandle, ProcessEntry32);
    while Found do
    begin
      //if StrPas(ProcessEntry32.szExeFile) = ' yourAppName.exe' then ;
//      if     ProcessEntry32.th32DefaultHeapID = AProcessID then
     if  UpperCase(StrPas(ProcessEntry32.szExeFile))=uppercase('notepad.exe') then
      begin
        ShowMessage(intToStr(ProcessEntry32.th32ProcessID));
      end;
      Found := Process32Next(AHandle, ProcessEntry32);
//      Found := Process32Next(AWnd, ProcessEntry32);
    end;
  finally
    CloseHandle(AHandle);
  end;
end;
搞不懂!搞不懂!永遠都搞不懂!!
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-24 17:49:23 IP:221.226.xxx.xxx 未訂閱
================================================ 用以下的 Function 寫, 只能取到一個 exe 的值 ================================================ Function IsExecute(FileName : String) : Boolean; var MyWnd : Thandle; begin MyWnd := FindWindow(nil, pchar(FileName)); Result := MyWnd<>0; end;    呵呵,可能我比较懒一点吧,不过不管老猫、小猫能抓到老鼠就是好猫。所以代码越少越好。    改进一下就可以关闭所有的了。    
//bCloseAll 是否关闭所有的    function CloseApp(sAppTitle : String;bCloseAll:Boolean) : Integer;
var
  PrevInstHandle : HWnd;
  //返回值大于0时表示关闭的个数,-1表示没有程序运行
begin
  PrevInstHandle := FindWindow(nil, PChar(sAppTitle));
  Result := 0;
  While PrevInstHandle<>0 do
  begin
    SendMessage(PrevInstHandle,WM_CLOSE,0,0);
    if Not bCloseAll then Break;
    PrevInstHandle := FindWindow(nil, PChar(sAppTitle));
    Inc(Result);
  end;
  if Result=0 then Result := -1;
end;    
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-25 19:00:42 IP:61.221.xxx.xxx 未訂閱
hihi 我想二者是不太一樣的 vicen大大的方法應該是無法指定刪除相同程式例如 開了三個notepad.exe 我只想指定刪除某一進程的notepad.exe 所以rain(忘了範例是那位大大提供的了^^)大大的方法在範例裡是有提到的
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;
結合上面的程式再加一點變化應該是可達成你的要求的 搞不懂!搞不懂!永遠都搞不懂!!
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-29 09:37:39 IP:219.93.xxx.xxx 未訂閱
謝謝 mine 所提供的意見 , 問題已得到解決. 也謝謝 Vicen 的幫助 ^_^
系統時間:2024-04-29 5:53:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!