20081009

[解法]windows下確認另一個程式已執行完畢含前景偵測

[解法]windows下確認另一個程式已執行完畢含前景偵測
作者:
Aeon Linn
http://aeon.tw
aeonlinn@gmail.com

問題:
在用delphi開發應用軟體時,
需執行另外一支exe程式,並等待exe程式執行完畢之後進行下一步驟;
此時應採用winodows sdk來處理,
意味著這種處理可以在其他windows下的程式語言中產生作用:如C++

解法:
針對另一支程式anotherprog.exe執行後視窗標題為Anotherprog 1.0的範例
1.
//用此方法等待程式啟動
hProg:THandle;
hProg:=ShellExecute(Application.Handle, 'open', 'anotherprog.exe',nil, nil, SW_SHOWDEFAULT);
WaitForSingleObject(hProg, INFINITE);
//do next....
2.
//用程式視窗標題取得程式是否在運行中
hwnd_TEMP:=Findwindow(nil,'Anotherprog 1.0');
3.
//用程式視窗標題取得程式是否在前景
GETWINLIST;
nhww:=GETWINID('Anotherprog 1.0');
//---------------------------------------------------
//取得前景運作中的視窗程式清單
public sg1: TStringGrid;
//---------------------------------------------------
procedure TForm1.GETWINLIST;
var
 Buffer : Array[0..99] of char;
  h1:HWND;
 dwProcess1: DWORD;
 cnt:DWORD;
 szModName:array [0..255]of char;
 hProc:THandle;
 hMod: HMODULE;
 i:integer;
 strtmp:string;
begin
 i:=0;
 while i begin
  sg1.Rows[i].Clear;
  inc(i);
 end;
 h1:=GetforegroundWindow;
 GetWindowText(h1,Buffer,100);
 h1:=GetNextWindow(h1,GW_HWNDNEXT);
 i:=0;
 while h1>0 do
 begin
  h1:=GetNextWindow(h1,GW_HWNDNEXT);
  if not (IsWindow(h1) and IsWindowVisible(h1)) then continue;

  GetWindowText(h1,Buffer,100);

  GetWindowThreadProcessId(h1, @dwProcess1);
  hProc:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, dwProcess1);

  if (hProc)<>0 then
  begin
   FillChar(szModName, SizeOf(szModName), 0);
   EnumProcessModules(hProc, @hMod, SizeOf(hMod), cnt);
   if GetModuleFileNameEx(hProc, hMod, szModName,sizeof(szModName))<>0 then
   begin
    strtmp:=UpperCASE(string(szModName));
    sg1.RowCount:=i+1;
    sg1.Cells[0,i]:=Buffer;
    sg1.Cells[1,i]:=strtmp;
    if pos('.EXE',strtmp)>0 then sg1.Cells[3,i]:='1';
    if pos('IEXPLORE',strtmp)>0 then
    begin
     sg1.Cells[3,i]:='0';
    end;
    sg1.Cells[2,i]:=inttostr(h1);
    inc(i);
   end;
   CloseHandle(hProc);
  end;
 end;//while
end;

//取得特定程式或視窗代碼,若不存在則回傳0
function TForm1.GETWINID(strFN:string):integer;
var
 nR:integer;
begin
 nR:=sg1.Cols[0].IndexOf(strFN);
 if nR<0 then
  result:=0
 else
  result:=strtoint(sg1.Cells[2,nR]);
end;

4.
hwnd_TEMP為0的狀態表示程式已執行結束
hwnd_TEMP為0且nhww為0表示程式在背景執行(被主程式遮蔽)
hwnd_TEMP為0且nhww不為0表示程式在前景執行中

附註:
1.若有疑問或建議請不吝來信指教
2.所附的程式碼在取用時需作修改,這方面請別問我:)

#

0 意見:

張貼留言