程序内至到form里 |
缺席
|
mayingjie313
一般會員 發表:7 回覆:11 積分:3 註冊:2008-09-23 發送簡訊給我 |
各位大大,我想把打开的一个EXE程序内嵌到我的panel里面,先通过把所有窗体列举,然后判断完后,找到我需要的哪个 接着放到panel里面 可是不行,这是我的程序 [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) title: TLabel; id: TLabel; Button1: TButton; Panel1: TPanel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type PEnumInfo = ^TEnumInfo; TEnumInfo = record ProcessID : DWORD; HWND : THandle; end; function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall; var PID : DWORD; begin GetWindowThreadProcessID(Wnd, @PID); Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND)); if not result then EI.HWND := WND; end; function FindMainWindow(PID: DWORD): DWORD; var EI : TEnumInfo; begin EI.ProcessID := PID; EI.HWND := 0; EnumWindows(@EnumWindowsProc, Integer(@EI)); Result := EI.HWND; end; procedure TForm1.Button1Click(Sender: TObject); var SI : TStartupInfo; PI : TProcessInformation; H : THandle; S : String; h1,h2:HWND; begin ZeroMemory(@SI, SizeOf(SI)); ZeroMemory(@PI, SizeOf(PI)); SI.cb := SizeOf(SI); if CreateProcess(nil,pchar('D:\Program Files\HT-IDE3000\BIN\HT-IDE3000.exe'), nil, nil, FALSE, 0 ,nil,nil, SI, PI) then begin WaitForInputIdle(PI.hProcess, INFINITE); H := FindMainWindow(PI.dwProcessID); { if H > 0 then begin SetLength(S, 255); GetWindowText(H, PChar(S), 255); Form1.Caption:=s; SetLength(S, StrLen(PChar(S))); ID.Caption :='App PID= ' inttostr(PI.dwProcessID); Title.caption := 'App Title= ' s; h1:=FindWindow(nil,PChar(s)); } H2 := Panel1.Handle; Windows.SetParent(H,H2); // 將外部程式放在 Panel0 Windows.ShowWindow(H,SW_MAXIMIZE); end; CloseHandle(PI.hProcess); CloseHandle(PI.hThread); end; end. [/code] 編輯記錄
|
mayingjie313
一般會員 發表:7 回覆:11 積分:3 註冊:2008-09-23 發送簡訊給我 |
现在我参照这个的
http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=94449 发现findwindowtext并没有得到实际显示的CAPTION,而是显示一些英文,本来想通过FindWindow 找到对于的HWND,可是失败了 |
mayingjie313
一般會員 發表:7 回覆:11 積分:3 註冊:2008-09-23 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
MSDN:
http://msdn.microsoft.com/en-us/library/ms687022(VS.85).aspx : 略 : if CreateProcess(nil,pchar(edit1.text), nil, nil, FALSE, 0 ,nil,nil, SI, PI) then begin //SLEEP(3000); // 我誏它等另一支程式三秒鐘,目的要證明上一行沒作用,也能取得HANDLE值 H := FindMainWindow(PI.dwProcessID); // 由 PID 取得 HANDLE if H > 0 then : : 略
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-10-15 17:51:57, 註解 無‧
|
mayingjie313
一般會員 發表:7 回覆:11 積分:3 註冊:2008-09-23 發送簡訊給我 |
谢谢pceyes,我现在发现其实是这样的 ,运行EXE文件后,这个程序其实是 调用其他的一个程序,也就是我 双击的是一个启动程序,怎么才能获得调用后程序的句柄呢?
就像KEIL,MATLAB那些。所以总不再我的PANELL里面显示 ===================引 用 pceyes 文 章=================== MSDN: http://msdn.microsoft.com/en-us/library/ms687022(VS.85).aspx : 略 : if CreateProcess(nil,pchar(edit1.text), nil, nil, FALSE, 0 ,nil,nil, SI, PI) then begin //SLEEP(3000); // 我誏它等另一支程式三秒鐘,目的要證明上一行沒作用,也能取得HANDLE值 H := FindMainWindow(PI.dwProcessID); // 由 PID 取得 HANDLE if H > 0 then : : 略 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |