作者:
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
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 意見:
張貼留言