在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;
Run Code Online (Sandbox Code Playgroud) 我有一个WPF应用程序,我想看起来它托管在另一个 - 非WPF - 应用程序.在现实生活中,这个非WPF应用程序是Internet Explorer中的ActiveX,但为了说明问题,我使用了一个简单的Windows窗体应用程序.
我使用Windows API函数SetParent,已经有几十个线程.但是,我找不到任何关于我的确切问题的内容:WPF应用程序右侧和底部的小区域未在非WPF应用程序窗口内绘制.
WPF窗口自行运行:

使用WinForm应用程序窗口作为父级的WPF窗口:

如果将WPF应用程序与WinForms应用程序或普通Win32应用程序(如记事本)交换,我不会遇到此问题.
WinForm代码如下所示:
private void Form1_Load(object sender, EventArgs e)
{
// Start process
var psi = new ProcessStartInfo("c:\\wpfapp\\wpfapp\\bin\\Debug\\wpfapp.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
_process = Process.Start(psi);
// Sleep until new process is ready
Thread.Sleep(1000);
// Set new process's parent to this window
SetParent(_process.MainWindowHandle, this.Handle);
// Remove WS_POPUP and add WS_CHILD window style to child window
const int GWL_STYLE = -16;
const long WS_POPUP = 0x80000000;
const long WS_CHILD = 0x40000000;
long …Run Code Online (Sandbox Code Playgroud) 我一直试图让Microsoft Access从主Access窗口"逃脱",以便我可以隐藏Access窗口并在桌面上显示表单,以便它可以轻松地与其他应用程序一起放置.
起初我发现了一些使用Access自己的Form.PopUp属性的代码示例,但这不能在运行时设置,只有在设计视图中才能设置.虽然这似乎达到了我想要做的,但有两个缺点:
在设计视图和普通视图之间切换需要在两者之间"关闭"窗口 - 我宁愿保持打开以保持当前状态,特别是因为它用于创建必须未保存的新记录.
我想打开其他形式的主要形式,除非它们也设置为"弹出式",否则这种形式似乎也不能很好地运行.但这很麻烦,因为这些也需要放入设计视图等,我不确定在两个弹出窗口之间切换是否容易.
然后我找到了一个名为SetParent的API函数,似乎可以满足我的需求.我使用了以下命令(VBA语法):
SetParent ShowForm.hWnd
ShowWindow hWndAccessApp, SW_HIDE
ShowWindow ShowForm.hWnd, SW_SHOWNORMAL
Run Code Online (Sandbox Code Playgroud)
但是我遇到了两个问题(可能是相关的:
窗口似乎没有反应(我无法输入它,例如,单击按钮似乎也没有工作).
当我做ALT + TAB时,我得到了一个BSOD:
BugCheck 1000008E, {c0000005, 9e3573f5, 88d9da10, 0}
Probably caused by : win32k.sys ( win32k!xxxNextWindow+3a6 )
at win32k!EngLineTo+1a641
Run Code Online (Sandbox Code Playgroud)有没有其他方法可以这样做,以便我可以有一个没有访问窗口的表单,能够在主访问窗口之外调用和显示其他访问表单?
我在SetParent API文档中注意到还有其他一些事情需要完成 - 更改UI状态和更改窗口样式但我找不到正确的方法来执行它们.这样做会解决BSOD和无响应问题吗?
谢谢你的任何想法!
我已经在这里读了很多近5年了,但这是我在这里发表的第一篇文章.
我目前正在开发一个VB.NET项目,我需要在Window窗体中打开Lotus Notes.我尝试使用SetParent功能,就像我在这里看到的那样
http://xtremevbtalk.com/showthread.php?t=272163.
它对我有用,但问题是,当我的Lotus Notes客户端上的窗口关闭时,整个客户端将关闭.当我尝试重新打开邮件时,它将显示内存不足的错误或根本不响应.
该图显示了在VB.NET表单中打开的Lotus Notes

我尝试在注册表中增加堆大小值,如此处所述,但问题仍然存在.
http://forum.sysinternals.com/insufficient-memory_topic17945.html
图像显示单击button1时Lotus Notes无法打开

我还怀疑Insufficient Memory错误是否正确,因为当我检查任务管理器时,内存使用率并不高.
http://i61.tinypic.com/33jtyxe.png
任何评论和解决方案都非常受欢迎.
TIA.
罗斯
我创建了两个应用程序MainApps和SubApps,SubApps有一个模态类型对话框,如登录/注销表单等,它的工作正常.
将其附加到MainApps后,"模态"对话框显示为普通的框形式.它的行为类似于"DIALOG.SHOW"而不是"DIALOG.SHOWMODAL";
我正在使用delphi编译器
SubApps按钮点击;
begin
with TfrmDialog.Create(Self, dtLogout) do
try
iMsgResult := ShowModal;
finally
Free;
end;
if iMsgResult = mrOk then
begin
dmVoca.FHomeworkXMLDoc.Active := False;
//Disabled Double Login
dmVoca.tmrDoubleLogin.Enabled := False;
................
end;
end;
Run Code Online (Sandbox Code Playgroud)
MainApps ButtonClick
begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
Run Code Online (Sandbox Code Playgroud) 我试图childForm通过PInvoke使用SetParent API 设置为主Excel窗口的子项:
Form childForm = new MyForm();
IntPtr excelHandle = (IntPtr) excelApplication.Hwnd;
SetParent(childForm.Handle, excelHandle);
childForm.StartPosition = FormStartPosition.Manual;
childForm.Left = 0;
childForm.Top = 0;
Run Code Online (Sandbox Code Playgroud)
如您所见,我的目的也是将孩子放在Excel窗口的左上角.然而,由于某种原因,childForm总是在一些奇怪的位置结束.
我做错了什么?
setparent ×6
delphi ×2
c# ×1
dialog ×1
excel ×1
forms ×1
lotus-notes ×1
modal-dialog ×1
ms-access ×1
shellexecute ×1
vb.net ×1
winapi ×1
windows ×1
winforms ×1
wpf ×1