有没有办法让窗口在窗口中包含自定义应用程序

Is there a way to have a window contain custom applications in windows?

本文关键字:窗口 包含 自定义 应用程序 有没有      更新时间:2023-09-26

这有点古怪,虽然不完全,但我在想是否有办法创建一个可以包含自定义应用程序的窗口(即 *.exe)。例如,有一个主窗口,并在一个选项卡中包含应用程序 1,在另一个选项卡中包含应用程序 2。不确定到底要标记什么,所以只是抛出一些可能有用的标签。

可以这样做。调用 Win32 函数SetParent,使应用程序的主窗口成为其中一个窗口的子窗口。

然而,试图这样做很少有好结果。总是其他应用程序不希望您这样做并且与之不兼容。这样做会严重限制这些进程的输入队列。

Raymond Chen 在博客中写道:调用跨进程父/子或所有者/拥有的窗口关系是否合法?

在不同进程的窗口之间建立父/子或所有者/拥有关系在技术上是否合法?

是的

,这在技术上是合法的。

玩弄电锯在技术上也是合法的。

创建跨线程父/子或所有者/拥有的窗口关系隐式附加这些窗口所属线程的输入队列,并且此连接是可传递的:如果其中一个队列附加到第三个队列,则所有三个队列都相互附加。更一般地说,由父/子或所有者/拥有或共享线程关系链相关的所有窗口的队列相互附加。

当父/子或所有者/拥有关系跨进程时,这变得更加复杂,因为跨进程协调比跨线程协调更难。在流程中共享变量比在流程之间共享变量要容易得多。最重要的是,某些窗口消息在进程之间被阻止。

所以是的,

这在技术上是合法的,但是如果您创建跨进程的父/子或所有者/所有者关系,后果可能很难管理。如果所涉及的一个或两个窗口不知道它正在参与跨进程窗口树,则它们几乎无法管理。(我经常在这样的背景下看到这个问题:有人想抓住属于另一个进程的窗口,强行将其嫁接到自己的进程中。另一个进程完全没有准备好以这种方式操纵它的窗口,事情可能会停止工作。实际上,如果将另一个窗口从顶级窗口更改为子窗口,则事情肯定会停止工作。

您甚至可以这样做是对为 16 位 Windows 编写的代码的向后兼容性 sop。它在现代Windows中确实没有位置。

可以使用WinForms MDI主机在窗口内运行窗口。但是,运行通用.exe文件,如果没有您希望它符合的特定标准,将是困难或不可能的。

如果您使用的是Visual Studio

右键单击工具箱

单击"选择项目..."

等待愚蠢的时间

browse to your exe

pick the controls

请注意,代码仍需要能够在运行时解析控件,这意味着部署 .NET 程序集,或者对于 ActiveX 部署互操作程序集并注册 COM dll。

在正在运行的窗体应用程序中托管单独的 exe 并非易事;您必须生成 exe (Process.Start),然后使用 win32 调用来获取适当的窗口句柄,目的是将窗口重新设置为您自己的窗口。这是一个合理的工作量,很容易出错,而且非常脆弱(如果你无聊它,就会发生糟糕的薄)。就个人而言:我根本不会。