【问题标题】:How do I place my custom toolbar (DeskBand?) on taskbar in Windows 7 win WPF?如何在 Windows 7 win WPF 的任务栏上放置自定义工具栏(DeskBand?)?
【发布时间】:2012-12-03 01:56:27
【问题描述】:

如何将自定义工具栏放置在 Windows 7 任务栏上的任务面板之前?有一个名为 Pokki 的流行应用程序可以做到这一点。 我想知道我该怎么做?

Edit1:我需要一种 100% 的方式来使用 Windows 7 的自定义工具栏(DeskBand?)。我不是在寻找一种固定应用程序解决方案,而是一种构建能够处理它自己的消息的自定义解决方案的方法并显示它自己的图标。非常感谢 C# 方式。

Edit2:非常感谢 WPF 方式。

【问题讨论】:

  • 您要找的是台带,但不支持 c# 中的台带。您必须使用 C 或 C++
  • C# 中不仅不支持开箱即用的桌带(您可能可以使用 PInvoke 调用一些 user32 方法),而是使用托管代码 (.net) 编写任何类型的 Shell 扩展是一个可怕的,可怕的想法。阅读这个讨论,它涵盖了编写 Shell 扩展的许多问题。 social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/…

标签: c# wpf winapi win32gui taskbar


【解决方案1】:

你会得到很多建议不要在 C# 中这样做。否则我不能推荐,您的桌带无法使用的可能性很大。问题是 CLR 版本注入问题,一个进程(如 explorer.exe)只能加载一个版本的 CLR。如果版本错误,您的桌带将无法使用。

.NET 4.0 中添加了针对此问题的非常具体的对策,其 CLR 支持 CLR 的进程内并行版本。换句话说,在单个进程中加载​​了多个 CLR。该功能适用​​于这种特定场景,即需要 CLR 的 COM 服务器,因为它是用托管代码编写的。所以一个绝对的要求是你要编写面向 .NET 4.0 或更高版本的扩展。

但是仍然存在遗留问题,这也是微软仍然不支持这种外壳扩展方案的核心原因。有一个“谁先来”的问题。尽管警告不要这样做,但仍有一些 shell 扩展使用托管代码并以 CLR 版本 2 为目标。如果这样的扩展在您的之前加载,这是一个完全随机的事件,因为它取决于顺序注册表中的键,资源管理器可能首先加载 CLR 2。然后阻止了进程内并行功能的工作,只有在首先加载 CLR 版本 4 时才能达到良好的效果。

这是完全无法诊断的,当无法加载扩展时,Explorer 不会发出吱吱声。而且对于普通用户来说是无法修复的,你不能指望他修补晦涩的注册表项。

要完全解决这个问题需要很长时间。实际上,Windows 需要停止支持 .NET 4 之前的 .NET 版本才能得到保证。 Windows 8 在默认情况下没有安装 .NET 3.5,但它仍然很容易添加它。所以要花很多时间,十年或更长时间。

好吧,小心,如果你不担心随机失败,你可以让它在 C# 中工作。接下来您将陷入非常晦涩的 COM 接口细节中,在这些细节中幸存下来需要知道如何正确声明 [ComImport] 接口的黑带技能。这不是你应该解决的问题,它已经被别人做了。我没有推荐产品的习惯,但不能跳过推荐EZShellExtensions,这是一个专门用于帮助用 C# 编写 shell 扩展的库。对桌带的支持是其广告功能之一。使用试用版来修补它,看看你是否可以把它搞定。

【讨论】:

    【解决方案2】:
    最近更新 更多