【问题标题】:How can I programatically tell Windows taskbar to open (or close) a given toolbar?如何以编程方式告诉 Windows 任务栏打开(或关闭)给定的工具栏?
【发布时间】:2008-12-07 05:18:48
【问题描述】:

我写了一个在任务栏上运行的toolbar。不幸的是,安装后,用户必须手动启用它。有没有办法告诉资源管理器打开(或关闭)给定的工具栏?

我希望安装程序 NSIS 在安装完成后打开工具栏(我意识到需要一个插件)。

我还想知道是否可以为所有用户自动启用工具栏,例如在多个用户共享一台 PC 的公司环境中。

【问题讨论】:

    标签: c# installation toolbar taskbar deskband


    【解决方案1】:
    • This CodeProject comment does it by simulating key presses
    • Vista+ 有 API 可以做到这一点,ShowDeskBandHideDeskBand
    • 编辑:此代码现在可以添加桌带对象(来自 Pinvoke.net 和 these two MSDN 论坛问题):

      [ComImport]
      [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
      [Guid("4CF504B0-DE96-11D0-8B3F-00A0C911E8E5")]
      public interface IBandSite
      {
          [PreserveSig]
          uint AddBand([In, MarshalAs(UnmanagedType.IUnknown)] Object pUnkSite);
          [PreserveSig]
          void RemoveBand(uint dwBandID);
      }
      
      
      private uint AddDeskbandToTray(Guid Deskband)
      {
          Guid IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
          Guid ITrayBand = new Guid("{F60AD0A0-E5E1-45cb-B51A-E15B9F8B2934}");   
          Type TrayBandSiteService = Type.GetTypeFromCLSID(ITrayBand, true);
          IBandSite BandSite = Activator.CreateInstance(TrayBandSiteService) as IBandSite;
          object DeskbandObject = CoCreateInstance(Deskband, null, CLSCTX.CLSCTX_INPROC_SERVER, IUnknown);
          return BandSite.AddBand(DeskbandObject);
      }
      

    还有一个例子:

    Guid address_toolbar_guid = new Guid("{01E04581-4EEE-11D0-BFE9-00AA005B4383}");
    uint band_id = AddDeskbandToTray(address_toolbar_guid);
    

    对 RemoveBand 的类似调用也可以解决问题是有道理的,但到目前为止,我无法让该代码工作。另一个问题:添加的桌带会在添加它的应用程序关闭时关闭。

    【讨论】:

    • IBandSite 界面怎么样?我还没有找到任何关于如何使用 SetBandState 方法的示例,但它看起来很有潜力。
    • IBandSite 确实有效,至少在添加桌带方面是这样。代码已更新。
    • 工具栏是应用程序,所以如果打开工具栏的应用程序关闭时工具栏消失,则它不起作用。我更多的是寻找像 Microsoft Search 安装程序或 Google 桌面安装程序这样永久打开工具栏的东西。
    • 只是为了记录,这段代码不能满足我的需要。一旦调用应用程序关闭,AddBand 方法不会导致工具栏保持加载状态。
    • 这在我的系统上效果很好,但在我的应用程序CreateInstance 的某些最终用户系统上会抛出一个带有错误代码 80040154 的 COMException。知道什么可能导致这种情况吗?
    【解决方案2】:

    您可能想check out this article。看起来您只能在 Vista 中使用 ITrayDeskBand interface 执行此操作(无论如何“官方”)。

    【讨论】:

      【解决方案3】:

      我现在找不到确切的 url,但我记得在 PDC2008 周围对此进行了一些讨论,基本上没有专门启用此功能,因此随机程序无法在未经用户同意的情况下填充任务栏。

      这样做的副作用是很少有用户默认启用 WMP 桌面栏。

      【讨论】:

      • 我认为一定有办法做到这一点,因为我见过几个微软安装程序(如搜索)和谷歌自动打开他们的工具栏。
      • 嗯,总有可能有一些方法可以做到这一点,当然不支持并且不能保证在未来的版本中工作。
      【解决方案4】:

      据我了解,任务栏的位置和值等都存储在注册表中(忘记了确切位置),因此如果您找到特定的注册表项,您可以获取它的位置并让您的安装程序在计算机上插入注册表项,以便任务栏已启用。

      【讨论】:

        【解决方案5】:

        不是您的问题的真正答案,但请:不要在 .NET 中编写 shell 扩展(任务栏是 shell 扩展)!

        Here's why.

        基本上,您正在破坏其他应用程序。

        【讨论】:

        • 我其实很熟悉为什么不这样做的原因(至少我现在这样做了,我刚开始的时候没有这样做)。我是一名自学成才的程序员,我没有使用 C/C++ 的经验。我从 VB.NET 开始学习并自学了 C#。
        【解决方案6】:

        如果你检查得当,google toolband 存在,而 exe 在后面运行 (GoogleDesktop.exe),所以如果你坚持 google 或搜索栏的实例化方式,你应该再次检查 TrayBandSiteService 并制作一个支持 exe...

        【讨论】:

          猜你喜欢
          • 2011-01-05
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 2016-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多