如何偵測程式正在執行 |
尚未結案
|
bennykyp
一般會員 發表:11 回覆:31 積分:8 註冊:2004-10-21 發送簡訊給我 |
各位好,有個問題想請教大家 比如: 我有一個程式 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 發送簡訊給我 |
两种方法,一种通过窗口的标题文字判断,第二种列举系统中的进程,然后对比可执行文件路径名称。 第一种方法较简单
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 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
bennykyp
一般會員 發表:11 回覆:31 積分:8 註冊:2004-10-21 發送簡訊給我 |
謝謝大家的熱情幫助 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 發送簡訊給我 |
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 發送簡訊給我 |
================================================
用以下的 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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |