gpt4 book ai didi

delphi - 如何shell到另一个应用程序并让它以delphi形式出现

转载 作者:行者123 更新时间:2023-12-03 14:39:59 26 4
gpt4 key购买 nike

在 Delphi 中,我多年来一直使用 ShellExecute 来启动(并可选择等待)其他应用程序。但现在,我需要让这些应用程序之一出现在我的 Delphi 应用程序表单之一中。我尝试使用下面的代码作为一个简单的测试来打开记事本(它会这样做)并在我的表单上的 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() 返回的任何窗口句柄。

关于delphi - 如何shell到另一个应用程序并让它以delphi形式出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com