标签: setparent

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

在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)

delphi shellexecute setparent

11
推荐指数
1
解决办法
1万
查看次数

使用WIn32 SetParent()在非WPF应用程序内托管WPF应用程序

我有一个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)

windows wpf setparent

8
推荐指数
1
解决办法
5049
查看次数

使用SetParent使Access窗体从Access中转义

我一直试图让Microsoft Access从主Access窗口"逃脱",以便我可以隐藏Access窗口并在桌面上显示表单,以便它可以轻松地与其他应用程序一起放置.

起初我发现了一些使用Access自己的Form.PopUp属性的代码示例,但这不能在运行时设置,只有在设计视图中才能设置.虽然这似乎达到了我想要做的,但有两个缺点:

  1. 在设计视图和普通视图之间切换需要在两者之间"关闭"窗口 - 我宁愿保持打开以保持当前状态,特别是因为它用于创建必须未保存的新记录.

  2. 我想打开其他形式的主要形式,除非它们也设置为"弹出式",否则这种形式似乎也不能很好地运行.但这很麻烦,因为这些也需要放入设计视图等,我不确定在两个弹出窗口之间切换是否容易.

然后我找到了一个名为SetParent的API函数,似乎可以满足我的需求.我使用了以下命令(VBA语法):

SetParent ShowForm.hWnd
ShowWindow hWndAccessApp, SW_HIDE
ShowWindow ShowForm.hWnd, SW_SHOWNORMAL
Run Code Online (Sandbox Code Playgroud)

但是我遇到了两个问题(可能是相关的:

  1. 窗口似乎没有反应(我无法输入它,例如,单击按钮似乎也没有工作).

  2. 当我做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和无响应问题吗?

谢谢你的任何想法!

winapi ms-access setparent ms-access-2013

5
推荐指数
1
解决办法
882
查看次数

在VB.NET表单中打开Lotus Notes

我已经在这里读了很多近5年了,但这是我在这里发表的第一篇文章.

我目前正在开发一个VB.NET项目,我需要在Window窗体中打开Lotus Notes.我尝试使用SetParent功能,就像我在这里看到的那样

http://xtremevbtalk.com/showthread.php?t=272163.

它对我有用,但问题是,当我的Lotus Notes客户端上的窗口关闭时,整个客户端将关闭.当我尝试重新打开邮件时,它将显示内存不足的错误或根本不响应.

该图显示了在VB.NET表单中打开的Lotus Notes

Lotus Notes在VB.NET表单中打开

我尝试在注册表中增加堆大小值,如此处所述,但问题仍然存在.

http://forum.sysinternals.com/insufficient-memory_topic17945.html

图像显示单击button1时Lotus Notes无法打开

单击button1时,Lotus Notes无法打开

我还怀疑Insufficient Memory错误是否正确,因为当我检查任务管理器时,内存使用率并不高.

http://i61.tinypic.com/33jtyxe.png

任何评论和解决方案都非常受欢迎.

TIA.

罗斯

vb.net lotus-notes ui-automation setparent

5
推荐指数
0
解决办法
607
查看次数

分配给Setparent(..)后Showmodal中的问题

我创建了两个应用程序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)

forms delphi dialog modal-dialog setparent

3
推荐指数
1
解决办法
2200
查看次数

使用SetParent()时问题定位窗口

我试图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总是在一些奇怪的位置结束.

我做错了什么?

c# excel office-automation setparent winforms

3
推荐指数
2
解决办法
1万
查看次数