Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将窗口的父对象()设置为SHELLDLL\u DefView安全吗?_C#_C++_Winapi_Com Interop - Fatal编程技术网

C# 将窗口的父对象()设置为SHELLDLL\u DefView安全吗?

C# 将窗口的父对象()设置为SHELLDLL\u DefView安全吗?,c#,c++,winapi,com-interop,C#,C++,Winapi,Com Interop,这不是建议问题的重复。来自我的问题:“我不是问如何编写代码。代码是有效的。”+“如果这个SHELLDLL\u deView基本上是桌面窗口,因此我应该接受应该避免使用小工具功能,或者如果这有点不同,可以使用。”编辑结束 据了解,使用桌面窗口通常是个坏主意。这似乎也是奥巴马的观点 不幸的是,桌面小工具已经退役,因此实现其功能的唯一方法是将其设置为窗口的父窗口 因为我自己知道的还不够多,我想知道是否有人能告诉我这个SHELLDLL\u DefView基本上是桌面窗口,因此我应该接受应该避免使用gad

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

据了解,使用桌面窗口通常是个坏主意。这似乎也是奥巴马的观点

不幸的是,桌面小工具已经退役,因此实现其功能的唯一方法是将其设置为窗口的父窗口

因为我自己知道的还不够多,我想知道是否有人能告诉我这个
SHELLDLL\u DefView
基本上是桌面窗口,因此我应该接受应该避免使用gadget功能,或者这有点不同,可以使用

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

(我的代码在C++中,但它与Win32是互通的,所以我用C++来标记它,因为C++的DEVs最可能知道这个)。 如果有人能告诉我这个SHELLDLL_deView基本上是不是桌面窗口

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

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

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

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

  • 如果您使用
    SetParent
    使shell桌面成为您的父对象,那么您肯定是在违反规则。但可能会导致与连接的输入队列相关的问题

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

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


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

    桌面窗口的特殊性与您将面临的实际问题无关:跨线程安装窗口层次结构(父/子、所有者/所有者)需要两个线程的合作(有关详细信息,请参阅)。除非同时控制两个参与线程,否则无法安全地执行此操作。由于您询问的是桌面窗口,因此至少有一个线程是您无法控制的

    如果这还不够吓唬你,这里有一些额外的阅读材料:


    十多年来,我一直在进行类似的破解(但不是这次),从那以后,WIN32 API似乎一直保持稳定。尽管没有保证,但在整个测试过程中始终需要;-)@斯蒂芬,谢谢。但我特别担心这个。如果我所做的真的是这些家伙所警告的(这是我的问题),我可能只需要避免它。在不属于你的窗口上调用SetParent永远都不安全。有时,它只是碰巧起作用。重复的标记答案可能完全回答了您的问题。安装跨线程窗口层次结构是合法的。然而,只有控制两个线程,它才是安全的。除非OP在shell团队中工作,否则它们至少不能控制一个相关线程的代码,因此它们不可能可靠地完成这项工作。