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

如何判斷TrayIcon的程式是否正在執行?

答題得分者是:Rain
yedda
一般會員


發表:13
回覆:27
積分:8
註冊:2002-07-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-14 15:58:09 IP:61.218.xxx.xxx 未訂閱
Dear all: 請問如何判斷 TrayIcon 程式是否正在執行中,原本想用FindWindow的做法,但因MainForm已被Hide,所以找不到該Window Handle,所以只能判斷該程式是否在執行中,不知該如何判斷 TrayIcon 程式是否正在執行呢? 發表人 - yedda 於 2003/07/14 15:59:25
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-14 17:40:39 IP:218.85.xxx.xxx 未訂閱
已經被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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-14 18:04:15 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-14 19:44:55 IP:218.85.xxx.xxx 未訂閱
奇怪,你怎麼老是提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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-14 21:06:58 IP:211.23.xxx.xxx 未訂閱
這 TrayIcon 程式的定義是什麼? 你的程式是去找特定的 WINDOWS , 這和 TRAYICON 有什麼關係? ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
yedda
一般會員


發表:13
回覆:27
積分:8
註冊:2002-07-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-15 08:30:31 IP:61.218.xxx.xxx 未訂閱
因為我把它寫成工作列右下方的常駐程式了~~    
引言: 這 TrayIcon 程式的定義是什麼? 你的程式是去找特定的 WINDOWS , 這和 TRAYICON 有什麼關係? ...Aquarius
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-15 09:28:40 IP:218.5.xxx.xxx 未訂閱
繼續昨天晚上未做完的,使用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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-15 12:55:53 IP:211.23.xxx.xxx 未訂閱
引言: 因為我把它寫成工作列右下方的常駐程式了~~
引言: 這 TrayIcon 程式的定義是什麼? 你的程式是去找特定的 WINDOWS , 這和 TRAYICON 有什麼關係? ...Aquarius
如果是自己寫的程式, 那就簡單啦!! 用 MUTEX 就可以知道程式是否已經啟動.
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
系統時間:2024-05-08 11:59:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!