代码之家  ›  专栏  ›  技术社区  ›  ispiro

将窗口的parent()设置为SHELLDLL_DefView安全吗?

  •  0
  • ispiro  · 技术社区  · 5 年前

    这不是建议问题的重复。 我的问题是: 我不是在问如何编写代码。代码是有效的。 " + " 如果这个SHELLDLL_DefView基本上是桌面窗口,因此我应该接受应该避免使用小工具功能,或者如果这有点不同,可以使用。 " 编辑结束 .

    根据 Cody Gary Raymond Chen 使用桌面窗口通常是个坏主意。这似乎也是 Hans Passant 这是我的观点。

    不幸的是,桌面设备已经退役,所以实现其功能的唯一方法是使用 code such as this 这取决于环境 SHELLDLL_DefView 作为窗口的父窗口。

    因为我自己知道的还不够多,我想知道是否有人能告诉我 SHELLDLL_devview 基本上是桌面窗口,因此我应该接受小工具功能应该避免,或者如果这有点不同,可以使用。

    我不是在问如何编写代码。代码是有效的。我只想知道它是不是保险箱,或者它是否可能在路上造成麻烦。

    (我的代码是在C++的WPF中,但它是与Win32的互操作,所以我也用C++标记它,因为C++的DEVs最可能知道这个。)

    0 回复  |  直到 5 年前
        1
  •  3
  •   Anders    5 年前

    如果有人能告诉我这个SHELLDLL_DefView基本上是不是桌面窗口

    这取决于你所说的“基本上”是什么意思。

    你链接的信息来源表明,有两件事人们称之为“桌面窗口”

    1. shell桌面。Explorer调用一个未记录的函数,该函数将一个窗口注册为shell桌面窗口。此窗口始终位于z顺序的底部。出于兼容性原因,此窗口假装是来自16位Windows的Progman。它还举办了一个 IShellView 实例,该实例通常具有“SHELLDLL_DefView”类(但我认为在启用Active Desktop(Win98/2000/XP?)时,层次结构并不相同)。这个内部类名没有被记录为稳定的。

    如果你使用 SetParent 使shell桌面成为您的父级。 Cross-process SetParent is legal 但可能会导致与连接的输入队列相关的问题。

    另一个问题是shell可能会崩溃并导致进程崩溃。

    只要你明白外壳的布局将来可能会改变,我会说它是“安全的”。也许不是商业软件,但肯定是已知Windows版本上的小玩具。

    我不知道C#是否有问题。NET很可能没有在这种情况下进行测试。如果我要这么做,我肯定会在非托管语言中使用纯Win32。