【问题标题】:Is there a way to have a window contain custom applications in windows? [closed]有没有办法让一个窗口在窗口中包含自定义应用程序? [关闭]
【发布时间】:2014-04-08 21:38:24
【问题描述】:

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

【问题讨论】:

  • 什么是“自定义应用程序”?
  • @DavidHeffernan 任何 *.exe 应用程序

标签: c# java javascript windows winapi


【解决方案1】:

这是可以做到的。您调用 Win32 函数 SetParent 以使应用程序的主窗口成为您的一个窗口的子窗口。

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

Raymond Chen 写了一篇博客:Is it legal to call have a cross-process parent/child or owner/owned window relationship?

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

是的,这在技术上是合法的。

使用电锯在技术上也是合法的。

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

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

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

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

【讨论】:

  • 你在说什么先生...这不是问题...
  • 如果这不是问题,那么你的最后一段在说什么?
  • 它谈论将 .exe 文件添加到您的 winform...就像将 windows 媒体播放器添加到您的 winform...(在 winform 中托管一个 exe 文件)
  • 确实如此。你以为我在说什么?
  • 你为什么把它弄得这么庞大和复杂?
【解决方案2】:

可以使用 WinForms MDI 主机在窗口内运行窗口。但是,运行一个通用的 .exe 文件,没有您期望它遵循的特定标准,这将是困难或不可能的。

【讨论】:

    【解决方案3】:

    如果您使用的是 Visual Studio

    右键单击工具箱

    点击“选择项目...”

    等待一段愚蠢的时间

    browse to your exe
    
    
    pick the controls
    

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

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

    【讨论】:

    • 子类化是错误的术语。重养就是你的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多