在德尔菲我用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才能就上述应用程序。我不会希望那些要求在我最大的敌人。

你有没有想过用一个编辑控制,建立专门用于特尔斐(或一件编辑,你可以嵌入)?这可能是一个更好的办法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top