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

程序内至到form里

缺席
mayingjie313
一般會員


發表:7
回覆:11
積分:3
註冊:2008-09-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-15 15:49:50 IP:222.247.xxx.xxx 訂閱

各位大大,我想把打开的一个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 重新編輯於 2008-10-15 16:04:38, 註解 無‧
mayingjie313 重新編輯於 2008-10-15 17:14:47, 註解 無‧
mayingjie313
一般會員


發表:7
回覆:11
積分:3
註冊:2008-09-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-15 16:52:10 IP:222.247.xxx.xxx 訂閱
现在我参照这个的
http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=94449

发现findwindowtext并没有得到实际显示的CAPTION,而是显示一些英文,本来想通过FindWindow 找到对于的HWND,可是失败了

mayingjie313
一般會員


發表:7
回覆:11
積分:3
註冊:2008-09-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-15 17:13:53 IP:222.247.xxx.xxx 訂閱
发现这个程序可以内嵌了,但是只是对于CAPTION不会变化的才能内嵌,象KEIL这样的打开CAPTION变化的就不行,而象IE这些不变的就可以,我是通过PID来获得的,为什么还跟CAPTION有关啊?
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-15 17:39:20 IP:220.141.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-15 22:52:04 IP:124.147.xxx.xxx 訂閱
谢谢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
:
: 略

系統時間:2024-05-05 6:59:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!