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

請問如何在程式中去關掉另一個已開啟的程式

尚未結案
allan1314
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-07 16:33:06 IP:211.20.xxx.xxx 未訂閱
請問 我用WinExec 在A去開啟了B 我想在關掉A的同時,也關掉B 謝謝
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-07 17:05:08 IP:61.30.xxx.xxx 未訂閱
allan1314  你好:    這是我之前的一個case寫的,你擋著用先...    
    private
  //子系統的FLAG
  iHDTag: Integer;
  //子系統使用位置存放
  HDArray: array[1..1000] of Integer;
  //目前使用之PROCESS
  fLastProcess: THandle;    //sExeName  執行檔名稱, sParams 是參數如果你有的話啦...不然就空著吧,如果有一個以上要用  ,  號隔開
procedure TForm1.OpenSubSys(sExeName, sParams: String);
var
  ExecInfo: SHELLEXECUTEINFO;
  APath: array [0..MAX_PATH] of Char;
  //sFileName: String;
begin
  iHDTag:= iHDTag 1;
  FillMemory(@ExecInfo,SizeOf(SHELLEXECUTEINFO),0);
  ExecInfo.cbSize:= SizeOf(SHELLEXECUTEINFO);
  ExecInfo.fMask:= SEE_MASK_NOCLOSEPROCESS;      ExecInfo.Wnd:= 0;
  ExecInfo.lpFile:= PChar(Trim(sExeName));
  ExecInfo.lpParameters:= PChar(Trim(sParams));      ExecInfo.nShow := SW_SHOWNORMAL;
  ShellExecuteEx(@ExecInfo);
  fLastProcess:= ExecInfo.hProcess;      HDArray[iHDTag]:= fLastProcess;
  GetModuleFileNameEx(FLastProcess, 0, @APath[0], SizeOf(APath));      //WaitForSingleObject(fLastProcess, 10000);
  //sFilename:= StrPas(APath);
end;    procedure TForm1.CloseSubSys;
var
  ExitCode:DWORD;
  i: Integer;
begin
  for i:= 1 to iHDTag do
  begin
    if HDArray[i] <> 0 then
    begin
      GetExitCodeProcess(HDArray[i], ExitCode);
      if ExitCode=STILL_ACTIVE then
      begin
        TerminateProcess(HDArray[i],0);
        FLastProcess:= 0;
      end;
    end;
  end;
end;    
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-09 00:02:52 IP:61.71.xxx.xxx 未訂閱
引言: 請問 我用WinExec 在A去開啟了B 我想在關掉A的同時,也關掉B 謝謝
這是另外一種比較簡單
.....
implementation
uses ...    function CloseB(Wnd: HWnd): Boolean; stdcall;
         var sCap: array [0..255] of char;
begin
     GetWindowText(Wnd, sCap, sizeof(sCap));
     //mncap為視窗標題名稱, 即B程式的Application.Title
     // 你可以指定mncap變數代入, 或者直接以B的Application.Title取代
     // 如 'MYTITLE'
     if pos(mncap,sCap) > 0 then   
     begin
        PostMessage(Wnd, WM_CLOSE, 0, 0);
     end;
     CloseB:= True;
end;    呼叫時
EnumWindows(@CloseB,0);
allan1314
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-11 11:14:07 IP:211.20.xxx.xxx 未訂閱
再次感謝Jimmy_wei大大及P.D.大大的幫忙。 P.D.大大所寫的方式,就可以解決我的問題。 allan
系統時間:2024-05-05 8:40:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!