如何判斷TrayIcon的程式是否正在執行? |
答題得分者是:Rain
|
yedda
一般會員 發表:13 回覆:27 積分:8 註冊:2002-07-21 發送簡訊給我 |
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
已經被Hide的表單用FindWindow也是可以找著的,難道這樣不可以嗎: FindWindow(‘TMainForm’, nil);//or FindWindow(nil, ‘FormCaption’); 奇怪,在我這邊一個TrayIcon 程式試一下是沒有問題的,或者可再試試EnumWindows: function EnumWndProc(AWnd: HWND; AlParam: LPARAM):Boolean; stdcall; var WndCaption: array[0..254] of Char; WndClassName: array[0..254] of char; begin GetWindowText(AWnd, @WndCaption, 254); GetClassName(AWnd, @WndClassName, 254); if WndClassName[0] <> chr(0) then begin if StrPas(WndClassName) = 'TMainForm' then begin ShowWindow(AWnd, SW_RESTORE); end; end; //or //if (WndCaption[0] <> chr(0)) and (StrPas(WndCaption) = 'FormCaption') then //ShowWindow(AWnd, SW_RESTORE); Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWndProc, 0); end; |
yedda
一般會員 發表:13 回覆:27 積分:8 註冊:2002-07-21 發送簡訊給我 |
Sorry ~~ 可以利用 FIndWindow 找到Handle,這是沒問題的 :) 但若我想把 TrayIcon 執行中的程式關閉,再重新啟動,該如何做到呢? PS:如果Window已經被Hide起來的話 ~~
引言:已經被Hide的表單用FindWindow也是可以找著的,難道這樣不可以嗎: FindWindow(‘TMainForm’, nil);//or FindWindow(nil, ‘FormCaption’); 奇怪,在我這邊一個TrayIcon 程式試一下是沒有問題的,或者可再試試EnumWindows: function EnumWndProc(AWnd: HWND; AlParam: LPARAM):Boolean; stdcall; var WndCaption: array[0..254] of Char; WndClassName: array[0..254] of char; begin GetWindowText(AWnd, @WndCaption, 254); GetClassName(AWnd, @WndClassName, 254); if WndClassName[0] <> chr(0) then begin if StrPas(WndClassName) = 'TMainForm' then begin ShowWindow(AWnd, SW_RESTORE); end; end; //or //if (WndCaption[0] <> chr(0)) and (StrPas(WndCaption) = 'FormCaption') then //ShowWindow(AWnd, SW_RESTORE); Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWndProc, 0); end; |
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
奇怪,你怎麼老是提Hide,關閉再重新啟動如果知道程式的路徑的話好辦,在EnumWndProc過程增加: PostMessage(AWnd, WM_CLOSE, 0, 0); 再用ShellExecute啟動程式即可。 如果不知道,可取得所有進程列表,再進行判斷。或者你可在EnumWndProc過程增加下面代碼,不過還是有點問題,就是只能取得exe名稱,我不知道路徑該怎麼取得。 Uses ShellAPI, tlhelp32; var Found: Boolean; AHandle: THandle; AProcessID: DWORD; ProcessEntry32: TProcessEntry32; begin GetWindowThreadProcessId(AWnd, @AProcessID); AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessEntry32.dwSize := Sizeof(ProcessEntry32); Found := Process32First(AHandle, ProcessEntry32); while Found do begin if ProcessEntry32.th32ProcessID = AProcessID then begin ExitProcess(AProcessID); ShellExecute(Handle, ‘open’, ProcessEntry32.szExeFile, nil, nil, SW_SHOW);//此處有出入,只能取得Exe名稱 Break; end; Found := Process32Next(AHandle, ProcessEntry32); end; finally CloseHandle(AHandle); end; end; |
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
yedda
一般會員 發表:13 回覆:27 積分:8 註冊:2002-07-21 發送簡訊給我 |
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
繼續昨天晚上未做完的,使用GetModuleFileNameEx即可取得進程路徑(
記得要uses PSAPI單元),如果你的那個應用程式名稱是知道的,則可以
不用FindWindow或EnumWindows,在下面的程式中用if StrPas(ProcessEntry32.szExeFile) = 'yourAppName.exe'替代
if ProcessEntry32.th32ProcessID = AProcessID語句即可 給出完整的程式如下:
uses tlhelp32, ShellAPI, PSAPI; procedure TForm1.Button1Click(Sender: TObject); var Found: Boolean; AProcessID: DWORD; AWnd, AHandle: THandle; ProcessEntry32: TProcessEntry32; APath: array [0..MAX_PATH] of Char; begin AWnd := FindWindow('TMainForm', nil); if AWnd = 0 then Exit; GetWindowThreadProcessId(AWnd, @AProcessID); 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.th32ProcessID = AProcessID then begin GetModuleFileNameEx(OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessEntry32.th32ProcessID), 0, @APath[0], SizeOf(APath));//取得進程路徑 TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, True, ProcessEntry32.th32ProcessID), 0);//結束進程 ShellExecute(Handle, 'open', APath, nil, nil, SW_SHOW);//重新運行程式 //Break; end; Found := Process32Next(AHandle, ProcessEntry32); end; finally CloseHandle(AHandle); end; end;發表人 - |
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 因為我把它寫成工作列右下方的常駐程式了~~如果是自己寫的程式, 那就簡單啦!! 用 MUTEX 就可以知道程式是否已經啟動.引言: 這 TrayIcon 程式的定義是什麼? 你的程式是去找特定的 WINDOWS , 這和 TRAYICON 有什麼關係? ...Aquarius procedure CheckPrevInst ; begin Mutex:=CreateMutex(nil,false,'MyHMutexXXX') ; if WaitForSingleObject(Mutex,1000)=Wait_TimeOut then begin // 有前一份程式 Halt ; end ; end ;若要結束前一份程式, 一樣用 FindWindow 找就可以了, 看是要送 WM_QUIT 結束, 還是送一個自訂的 MESSAGE, 由那個程收到自訂 MESSAGE 後結束都可以. 若是用自訂 MESSAGE, 還可以在結束程式時, 順便在自動重新 RUN 一份新的行程. 只要在自己程式中, 想怎麼做都容易呀!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |