跨进程的SetParent

以前好像隐约听别人提到一次,一个进程的窗口可以跟另一个进程的窗口设置成父子关系。当时不太相信这样的说法,认为不可能的。真的能够跨进程SetParent吗?

看MSDN,SetParent里面说如果把hWndNewParent参数的值为NULL,则桌面窗口就是新的父窗口。桌面窗口就是在另外的explorer进程里面的,貌似是可以的,但是MSDN里面没有明确表态。今天我自己写了个测试程序,果然可以,真是毁三观啊,进程边界在哪里?跟之前想的完全不一样。

我最近想实现一个双核浏览器,就是在chromium浏览器的基础上加上IE内核,可以在Blink渲染引擎与Trident渲染引擎之间切换。这不是什么新东西了,国内的很多浏览器都实现这个技术,比如360安全浏览器,搜狗浏览器。我也要自己实现一个,虽然是重复的造轮子,但是在造轮子的过程中可以学到很多。

chromium的多进程架构我已经很熟悉了,就是renderer进程只负责渲染出网页,然后发送到browser进程去显示出来,同样browser进程把各种消息转发到renderer进程。IE的多进程架构则不一样,IE则是子进程真正的创建窗口,在窗口里面包了一个Internet Explorer Server,然后用SetParent嵌入到父进程的Frame Tab中。

所以要实现一个双核浏览器,在Blink内核,还是使用chromium那套机制,在Trident内核,则用模仿IE,在子进程创建Internet Explorer Server,嵌入到browser进程中。

说起来不是很复杂,但是要在保持这两个核有一致的用户体验还是需要下很多功夫去完善的。比如有个七星浏览器,Trident内核做的还是比较粗糙的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注