如何壳到另一个应用程序,并让它出现在德尔斐形式
-
18-09-2019 - |
题
在德尔菲我用ShellExecute年启动(和任选等)其他应用程序。尽管如此,现在我需要有一个这些应用程序出现在我的特尔斐应用程序的形式。我已经试过了下列代码作为一个简单的测试打开的记事本(其它)和显示的结果内PAnel1在我的形式(它不会).可以某种人把我放在正确的轨道?感谢
var
Rec : TShellExecuteInfo;
wnd : HWnd;
const
AVerb = 'open';
AParams = '';
AFileName = 'Notepad.exe';
ADir = '';
begin
FillChar(Rec, SizeOf(Rec), #0);
Rec.cbSize := SizeOf(Rec);
Rec.fMask := SEE_MASK_NOCLOSEPROCESS;
Rec.lpVerb := PChar( AVerb );
Rec.lpFile := PChar( AfileName );
Rec.lpParameters := PChar( AParams );
Rec.lpDirectory := PChar( Adir );
Rec.nShow := sw_Show;
ShellExecuteEx(@Rec);
wnd := Windows.FindWindow( 'Notepad', nil );
Windows.SetParent( Wnd, PAnel1.Handle );
end;
解决方案
检查省略所有的错误,但是这应该让你开始:
procedure TForm1.Button1Click(Sender: TObject);
var
Rec: TShellExecuteInfo;
const
AVerb = 'open';
AParams = '';
AFileName = 'Notepad.exe';
ADir = '';
begin
FillChar(Rec, SizeOf(Rec), #0);
Rec.cbSize := SizeOf(Rec);
Rec.fMask := SEE_MASK_NOCLOSEPROCESS;
Rec.lpVerb := PChar( AVerb );
Rec.lpFile := PChar( AfileName );
Rec.lpParameters := PChar( AParams );
Rec.lpDirectory := PChar( Adir );
Rec.nShow := SW_HIDE;
ShellExecuteEx(@Rec);
WaitForInputIdle(Rec.hProcess, 5000);
fNotepadHandle := Windows.FindWindow( 'Notepad', nil );
Windows.SetParent( fNotepadHandle, Handle );
Resize;
ShowWindow(fNotepadHandle, SW_SHOW);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
if IsWindow(fNotepadHandle) then begin
SetWindowPos(fNotepadHandle, 0, 0, 0, ClientWidth, ClientHeight,
SWP_ASYNCWINDOWPOS);
end;
end;
什么你绝对应该做的是枚举新进程的窗口,而不是简单地使用任何窗口句柄是 FindWindow函数()的回报。
其他提示
var
URL: string;
begin
URL:= DBMemoURL.Text;
// ShellExecute(self.WindowHandle,'open', PChar(URL), nil, nil, SW_SHOW); //default browser
ShellExecute(self.WindowHandle,'open','chrome.exe', PChar(URL), nil, SW_SHOW);
这将是一个棘手的问题,如果它甚至可能。
我已经看到的方法,将工作为基于文本的应用程序他们一般捕获的标准产出的过程,因为它发生,并把它变成一个文本控制。
但你在谈论什么是一个完全成熟的图形程序(记事本,尽管工作上的文字,显示像素,不符代码)。
因此,除非有记事本提供一个接口,你可以:
- 请求任意字符的缓冲区;和
- 发送任意键的程序, 我会说你是平坦的运气了。
绝对是一个临时搭配,但是一个选项是不断监测的记事本的windows,并确保它总是叠加在你的形式客户区。这是很可怕,因为你必须停止它的移动,大小的调整,尽量减少等, 和 维持其z才能就上述应用程序。我不会希望那些要求在我最大的敌人。
你有没有想过用一个编辑控制,建立专门用于特尔斐(或一件编辑,你可以嵌入)?这可能是一个更好的办法。
不隶属于 StackOverflow