C++ 如何将不同的可执行文件合并到单个窗口框架中?像浏览器一样?

C++ 如何将不同的可执行文件合并到单个窗口框架中?像浏览器一样?,c++,C++,好的,这里有一个noob问题:例如,如何对浏览器的功能进行编码?例如,打开chrome浏览器,可以打开多个选项卡。然后,您可以将一个选项卡移出窗口,它将成为另一个窗口,具有自己的独立进程。然后你可以把标签拖到另一个窗口,它们就变成一个框架了?与windows应用程序中的停靠类似,但如何使用可执行文件?我无法告诉您如何对其进行编码,您应该在chromium代码中搜索该功能以了解其编码方式,但我可以告诉您其工作原理: 在chromium内部,每个选项卡、扩展、实用程序等都是一个流程,其中每个流程都是

好的,这里有一个noob问题:例如,如何对浏览器的功能进行编码?例如,打开chrome浏览器,可以打开多个选项卡。然后,您可以将一个选项卡移出窗口,它将成为另一个窗口,具有自己的独立进程。然后你可以把标签拖到另一个窗口,它们就变成一个框架了?与windows应用程序中的停靠类似,但如何使用可执行文件?

我无法告诉您如何对其进行编码,您应该在chromium代码中搜索该功能以了解其编码方式,但我可以告诉您其工作原理:

在chromium内部,每个选项卡、扩展、实用程序等都是一个流程,其中每个流程都是“浏览器”流程的子流程,“浏览器”流程管理着一切(创建新窗口、打开新选项卡、关闭选项卡、销毁窗口等),因此,例如,每当您打开chromium的新实例时,您都会告诉“浏览器”创建新选项卡并将其放入新窗口的过程。 每个窗口由“浏览器”进程管理,每个选项卡由主进程的子进程管理

现在回答您的问题:当您在窗口外拖放选项卡时,您正在触发一个事件,该事件被“浏览器”进程捕获,该进程随后创建一个新窗口并将选项卡分配给新窗口

这些信息应该会提示您如何自己开发此功能


如果你想了解更多关于chromium架构的信息,我建议你阅读chromium是如何在Windows中设计的,尽管我认为其他OSs的工作原理基本相同:你为窗口获得的
HWND
句柄是全局的。如果您将其数值发送到另一个进程,该进程可以使用它来处理窗口:获取其信息,调整其大小,甚至在其上绘制。它不能做的是替换其事件处理程序函数

要像现在的浏览器一样实现进程分离,关键是创建一个容器窗口并将句柄发送给子进程。然后,子对象将创建自己的窗口作为容器的子对象。子窗口只是填充容器的整个内容区域

这样,内容进程包含在父窗口中,但可以处理事件


现在,如果要将选项卡拖出到它自己的顶级窗口中,父进程将创建一个包含所有UI的新顶级窗口,然后将内容容器重新设置为该新顶级窗口的父窗口。内容子项随之出现。

在浏览器中“拥有自己的独立进程”每个选项卡都已作为自己的进程启动。好的,那么如何合并它们呢?我不知道,但有一种方法可以找到firefox或chromium的代码库。顶级窗口在浏览器中不是独立的进程。选项卡内容为。所有顶级窗口通常属于同一进程。标题也有误导性,因为所有进程都是下面相同的可执行文件。“主UI”、“选项卡内容”和“插件主机”没有不同的EXE。嗯,插件主机实际上至少在Firefox中是一个单独的可执行文件(“plugin container.exe”)。顺便说一句,这不是一个noob问题。它的功能非常复杂,涉及大量进程间通信,必须仔细设计才能获得可接受的性能。