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