【问题标题】:Is it safe to SetParent() of a window to SHELLDLL_DefView?将窗口的 SetParent() 设置为 SHELLDLL_DefView 是否安全?
【发布时间】:2019-12-06 04:39:36
【问题描述】:

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

根据Cody GaryRaymond Chen 的说法,使用桌面窗口通常是个坏主意。这似乎也是Hans Passant的观点。

不幸的是,桌面小工具已被淘汰,因此实现其功能的唯一方法是使用 code such as this,它依赖于将 SHELLDLL_DefView 设置为窗口的父级。

由于我自己不够了解,我想知道是否有人可以告诉我这个SHELLDLL_DefView 是否基本上是桌面窗口,因此我应该接受应该避免使用小工具功能,或者这是否有点不同,可以使用。

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

(我的代码在 C#-WPF 中,但它与 Win32 互操作,所以我也用 C++ 标记它,因为 C++ 开发人员最有可能知道这一点。)

【问题讨论】:

  • 10 多年来,我一直在做类似的 hack(但不是这个),从那时起 WIN32 API 似乎一直很稳定。虽然不能保证,但在整个测试过程中总是需要它;-)
  • @Stefan 谢谢。但我特别担心这个。如果我正在做的事情真的是这些人所警告的(这是我的问题),我可能只需要避免它。
  • 在不属于您的窗口上调用 SetParent 永远不会安全。有时它只是碰巧起作用。
  • 骗子的标记答案完全回答了你的问题。

标签: c# c++ winapi com-interop


【解决方案1】:

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

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

您链接的来源清楚地表明人们将两件事称为“桌面窗口”

  1. 真正的桌面窗口。这是一个特殊的窗口管理器窗口,它作为 HWND 树的单个根。普通的应用程序窗口将此作为其父窗口,但 API 会假装这些窗口没有父窗口。

  2. 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。

【讨论】:

  • 安装跨线程窗口层次结构是合法的。但是,只有同时控制两个线程,它才是安全的。除非 OP 在 shell 团队中工作,否则他们不会控制所涉及的至少一个线程的代码,因此他们不可能使这项工作可靠地工作。
【解决方案2】:

桌面窗口的特殊性与您将面临的真正问题无关:跨线程安装窗口层次结构(父/子,所有者/拥有)需要合作两个线程(有关详细信息,请参阅Is it legal to have a cross-process parent/child or owner/owned window relationship?)。除非您控制两个参与线程,否则无法安全地完成此操作。由于您询问的是桌面窗口,因此至少有一个线程是您无法控制的。

如果你还不够害怕,这里有额外的阅读材料:

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 2016-01-27
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多