C# 如何将应用程序与Windows 7任务栏上的固定程序关联?

C# 如何将应用程序与Windows 7任务栏上的固定程序关联?,c#,.net,vba,windows-7,taskbar,C#,.net,Vba,Windows 7,Taskbar,我们有一个应用程序,我们称之为MyApp。在安装时,我们为MyApp创建一个桌面图标,它基本上调用MyLauncher.exe/launch MyApp.exe。MyLauncher做了一些有用的事情(检查更新等),然后启动MyApp 使用Windows 7的用户可能希望将其固定到任务栏(即,在桌面图标上单击鼠标右键“固定到任务栏”): 但是,由于快捷方式指向MyLauncher,因此当用户启动应用程序(使用桌面图标或任务栏图标)时会发生以下情况:MyLauncher完成其工作,然后启动My

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

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

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

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


显然,我的问题是:作为MyLauncher和MyApp的开发者,我能做些什么吗?我想让Windows 7任务栏“关联”使用快捷方式启动
MyLauncher.exe/lauch MyApp.exe的
MyApp.exe的所有实例

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

ShowInTaskbar=“False”

这种方法的问题在于,它会降低可用性,因为用户无法再判断应用程序何时运行,或者当应用程序在其他窗口后面丢失时,无法轻松地将其置于最前沿。为了缓解其中一些问题,您可以为此应用程序创建一个通知图标,该图标将启用其中一些功能,并向用户提供有关应用程序当前状态的一些反馈。(运行、不运行等)

有一个关于如何在windows窗体中创建通知图标的好代码示例。您也可以对WPF应用程序使用相同的方法

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

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

  • 双击>将应用程序置于最前面
  • 右键单击>将显示包含一些选项的上下文菜单。(即,向前移动、关闭等)
  • 鼠标悬停>将显示一个工具提示,其中包含有关应用程序的一些信息

尝试使用“应用程序ID” 有关更多信息,请参见此处:

“应用程序用户模型ID(AppUserModelID)被Windows 7及更高版本系统中的任务栏广泛使用,以将进程、文件和窗口与特定应用程序关联。在某些情况下,依赖系统分配给进程的内部AppUserModelID就足够了。但是,拥有多个进程的应用程序或在同一系统中运行的应用程序主机进程可能需要显式标识自己,以便它可以将其他不同的窗口分组到单个任务栏按钮下,并控制该应用程序跳转列表的内容 这更多的是一个架构问题-对于这样的目的来说,这是一个不寻常的设计,
i、 e.如果需要一个通常在应用程序内检查的更新程序(我猜你还有更多,但需要启动),那么如果认为更新是外部过程,那么你就启动一个外部过程并更新应用程序等
如果您正在启动许多不同的东西,或者您有一个通用的解决方案,或者在更复杂的情况下(例如,您有一个加载dll-s、服务等的“主机进程”),则Launcher(如上所述)是有意义的。
因此,基本上你会因为一个有点不幸的设计、决策而遇到问题,除非你有足够的理由证明这一点。
但是你说过你不想重新设计…
2)
你仍然可以用launcher做一个“把戏”——并做一些简单的工作

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

这可能会起作用,我还没有尝试过,但我不明白为什么不应该这样做——而且你可以保留现有的体系结构,等等。

已经提到设置应用程序用户模型ID。如何做到这一点,可以很容易地在这篇文章中看到:


但是您仍然存在这样的问题:当应用程序被锁定时,它不会锁定启动器。但也有一个解决方案,那就是将启动器固定住:

以防万一:MyApp.exe实际上是
msaccess.exe MyVbaProject.mdb
,因此是VBA标记。VBA应用程序大量使用(我们自己的).net库,因此使用c#和.net标记。任何一种语言的解决方案都可以。Windows API调用也可以。请参阅,如果您是.NET进程,这可能会有所帮助,Windows API代码包将提供帮助。