【问题标题】:How do I associate my application with a pinned program on the Windows 7 taskbar?如何将我的应用程序与 Windows 7 任务栏上的固定程序相关联?
【发布时间】:2012-04-01 05:40:12
【问题描述】:

我们有一个应用程序,我们称之为MyApp。在安装时,我们为 MyApp 创建一个桌面图标,它基本上调用MyLauncher.exe /launch MyApp.exe。 MyLauncher 做了一些有用的事情(检查更新等),然后启动 MyApp。

使用 Windows 7 的用户可能希望将其固定到任务栏(即,桌面图标上的鼠标右键,“固定到任务栏”):

但是,由于快捷方式指向 MyLauncher,因此当用户启动应用程序(使用桌面图标或任务栏图标)时会发生以下情况:MyLauncher 完成其工作,然后启动 MyApp。在任务栏上,结果如下:

我明白为什么会发生这种情况。由于 MyLauncher 启动 MyApp,Windows 7 任务栏将它们视为两个不同的应用程序。

显然,我的问题是:作为 MyLauncher 和 MyApp 的开发人员,我可以对此做些什么吗?我希望 Windows 7 任务栏将 MyApp.exe 的所有实例与以MyLauncher.exe /lauch MyApp.exe开头的快捷方式。

【问题讨论】:

标签: c# .net vba windows-7 taskbar


【解决方案1】:

已经提到设置应用程序用户模型 ID。在这篇文章中可以很容易地看到这是如何完成的:How to group different apps in Windows task bar?

但是你仍然有一个问题,当应用程序被固定时,它不会固定启动器。但也有一个解决方案,即固定启动器:Pinning to the taskbar a "chained process"

【讨论】:

    【解决方案2】:

    1)
    这更像是一个架构问题/问题 - 出于这种目的,这有点不寻常的设计,
    即,如果需要更新程序(我猜您还有更多但要开始使用),通常在应用程序内检查 - 然后如果认为更新,您启动外部进程并更新应用程序等。
    如果您要启动许多不同的东西,或者您有通用解决方案或更复杂的情况 - 例如,启动器(如所述)将是有意义的。您有一个加载 dll-s、服务等的“主机进程”。
    所以基本上你会因为有点不幸的设计和决定而遇到问题 - 除非你有足够的保证。
    但是你说你不想重新设计......
    2)
    你仍然可以用启动器做一个“技巧”——然后做一些简单的工作......

    • 首先启动“MyApp -argument:check”(桌面上的图标属于它,而不是启动器),启动时有一个参数“fork”,如果“check”执行一个小的“shim”代码推出“MyLauncher”,
    • 让启动器做它应该做的事情 - 您甚至可以在启动后关闭主 MyApp,
    • 当启动器完成后,它会再次启动 MyApp(或者如果仅在需要更新时才关闭则更复杂等 - 但前一个更容易),并使用一些其他参数或不使用任何参数(取决于什么你想要等),
    • 您正在执行某种进程的双重重定向 - 再次启动应用 => 启动器 => 应用,
    • 这样你应该对图标没有问题,
    • 如果需要“管理员”模式,您应该小心为任一应用程序(通常是需要更新的启动器,更多权限)提供适当的清单,但我想您已经有了,

    这可能会奏效,还没有尝试过,但我不明白为什么不应该这样做 - 而且您可以保持现有架构不变等。

    【讨论】:

      【解决方案3】:

      尝试使用“应用程序 ID” 请参阅此处了解更多信息: http://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx

      “应用程序用户模型 ID (AppUserModelIDs) 被 Windows 7 和更高版本系统中的任务栏广泛使用,以将进程、文件和窗口与特定应用程序相关联。在某些情况下,依赖分配的内部 AppUserModelID 就足够了但是,拥有多个进程的应用程序或在主机进程中运行的应用程序可能需要明确标识自己,以便它可以将其他不同的窗口分组在单个任务栏按钮和控制下该应用程序的跳转列表的内容。”

      【讨论】:

      • 如果您是 .NET 进程,Windows API 代码包会有所帮助。
      【解决方案4】:

      您可以做的一件事是根本不显示应用程序的任务栏图标。在 WPF 中,它就像属性设置一样简单:

      ShowInTaskbar="False"

      这种方法的问题在于它会降低可用性,因为用户无法再判断应用程序何时正在运行,或者当它迷失在其他窗口后面时很容易将它带到最前面。为了减轻这些担忧,您可以为此应用程序创建一个通知图标,该图标将启用其中一些功能,并为用户提供有关应用程序当前状态的一些反馈。 (跑,不跑等)

      This msdn resource 有一个很好的代码示例,介绍了如何在 Windows 窗体中创建通知图标。您也可以对 WPF 应用程序使用相同的方法。

      小提示:通知图标为 16x16 像素。尝试在调整大小之前找到图标的矢量版本,因为这样会得到更清晰的结果,因为在这种大小下你往往会丢失很多细节。

      一些用户与通知图标的交互可以包括:

      • 双击 > 将应用程序置于最前面
      • 右键单击 > 调出包含一些选项的上下文菜单。 (即放在前面、关闭等...)
      • Mouse-Over > 显示一个工具提示,其中包含有关应用程序的一些信息。

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 2010-11-30
        • 2012-02-12
        • 2010-11-18
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        相关资源
        最近更新 更多