Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将嵌入式窗口作为父窗口返回给windows_Delphi_Embed_Delphi Xe5 - Fatal编程技术网

Delphi 如何将嵌入式窗口作为父窗口返回给windows

Delphi 如何将嵌入式窗口作为父窗口返回给windows,delphi,embed,delphi-xe5,Delphi,Embed,Delphi Xe5,我正在使用ShellExecute启动Adobe Reader。之后,我将窗口重定向到带有WinApi.Windows.SetParent的面板。现在,当我关闭应用程序时,Adobe Reader在内存中仍然处于活动状态,我必须在任务管理器中结束该过程,然后才能打开新会话 我的问题是:如何在我的应用程序中访问Adobe Reader?我怎么跟它说话?(发送诸如close和minimilize之类的消息)以及如何将其作为家长返回windows?所有这些都在Delphi XE5中实现 编辑: 这是我

我正在使用ShellExecute启动Adobe Reader。之后,我将窗口重定向到带有WinApi.Windows.SetParent的面板。现在,当我关闭应用程序时,Adobe Reader在内存中仍然处于活动状态,我必须在任务管理器中结束该过程,然后才能打开新会话

我的问题是:如何在我的应用程序中访问Adobe Reader?我怎么跟它说话?(发送诸如close和minimilize之类的消息)以及如何将其作为家长返回windows?所有这些都在Delphi XE5中实现

编辑:

这是我用来设置新父级的代码:

ShellExecute(Handle, nil, PChar('C:\Tool\Temp.pdf'), nil,  nil, SW_SHOWNORMAL);
Sleep(500);
wHandle := FindWindow(NIL,'Temp.pdf - Adobe Reader');
WinApi.Windows.SetParent(wHandle, Panel1.Handle);

以下是我自己问题的答案:

  • 我已将句柄保存到wHandle变量。由于这是全局变量,我可以在代码中的任何位置访问它。例如,我表格中的OnClose事件

  • 要与Abobe阅读器“对话”,我必须使用SendMessage方法并传递所需的参数。我可以使用wHandle指向Adobe Reader。Adobe Reader的父级实际上没有问题

  • 当我想将Adobe Reader作为父对象返回Windows时,我只需将SetParent的NewParent参数从Panel1.Handle更改为0


我通过阅读我的问题的评论得到了答案。他们都为我指出了正确的方向。

这绝对是错误的解决方案,无论你的问题是什么
SetParent(Reader,Windows)
。如果失败,请使用
0
。或者使用
GetParent
将上一个父级保存为安全的父级(谁知道在您这样做之前还有谁为它设置了父级)。设置父级假定您知道窗口句柄,因此您可以将WM\U QUIT发送到此句柄。但是一般的方法似乎是错误的。呃,您调用了
SetParent
,并传递了窗口句柄。所以你已经有了它。如果你试图将一些毫无戒心的应用程序重新租入你的流程中,你会遇到很多问题。您不应该创建交叉进程的父进程。您只能作为16位兼容的sop。你应该避免这样做。