Windows 任务栏和开始菜单中固定 exe 的控制路径
Control path to pinned exe in Windows taskbar and start menu
我正在使用两个程序,"starter"(更新程序)和 "main" 程序。
starter 更新和启动 main.
固定到 windows 任务栏或开始菜单时,程序必须表现良好。
例如,用户应该能够:
- 开始"starter"
- 将 运行 "main" 固定到任务栏
- 关闭程序
- 使用任务栏上固定的项目启动程序。
是否可以使固定的快捷方式直接指向 "starter" 而不是 "main"?
我试过 ,但这不会影响固定的路径。
现在我正在 "starter" 的进程中加载 "main"。
这按预期工作但有一个问题,即所有更新都受到 .NET 版本 "starter" 的限制,现在已经很老了,.NET 3.5.
为System.AppUserModel设置以下属性。
- System.AppUserModel.ID
- System.AppUserModel.RelaunchCommand
- System.AppUserModel.RelaunchDisplayNameResource
在 C# 中,您可以使用 Windows-API-Code-Pack or its NuGet package WindowsAPICodePack-Shell。
注意 unknown reason you can't easily change the path once it's set.
void SetTaskbarRelaunchCommand(Form form)
{
// WARNING, once RelaunchCommand has been set it can't be changed for any given appID.
// Workaround: delete all links here related to our app.
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
// Source:
var appID = "MyAppID";
var path = @"C:\Program Files (x86)\MyApp\Updater.exe");
var handle = form.Handle;
var propGuid = new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}");
var ID = new PropertyKey(propGuid, 5); // System.AppUserModel.ID
var RelaunchCommand = new PropertyKey(propGuid, 2); // System.AppUserModel.RelaunchCommand
var RelaunchDisplayNameResource = new PropertyKey(propGuid, 4); // System.AppUserModel.RelaunchDisplayNameResource
WindowProperties.SetWindowProperty(handle, ID, appID);
WindowProperties.SetWindowProperty(handle, RelaunchCommand, path);
WindowProperties.SetWindowProperty(handle, RelaunchDisplayNameResource, "Label of My App");
}
您还可以完全阻止应用固定。
由于 opposed to RelaunchCommand 您可以随时更改此值。
void PreventPinning(IntPtr handle)
{
var appID = "MyAppNoPin";
var propGuid = new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}");
var ID = new PropertyKey(propGuid, 5); // System.AppUserModel.ID
var PreventPinning = new PropertyKey(propGuid, 9); // System.AppUserModel.PreventPinning
//Important: Set PreventPinning before ID
WindowProperties.SetWindowProperty(handle, PreventPinning, "True");
WindowProperties.SetWindowProperty(handle, ID, appID);
}
我在最新的 Windows 10 更新中未能成功设置 RelaunchCommand 和 RelaunchDisplayNameResource。但是我找到了一个解决方案,使用您的第一种方法将启动器固定到任务栏,设置一个通用的 AppID:Pinning to the taskbar a "chained process"
我正在使用两个程序,"starter"(更新程序)和 "main" 程序。 starter 更新和启动 main.
固定到 windows 任务栏或开始菜单时,程序必须表现良好。 例如,用户应该能够:
- 开始"starter"
- 将 运行 "main" 固定到任务栏
- 关闭程序
- 使用任务栏上固定的项目启动程序。
是否可以使固定的快捷方式直接指向 "starter" 而不是 "main"?
我试过
现在我正在 "starter" 的进程中加载 "main"。 这按预期工作但有一个问题,即所有更新都受到 .NET 版本 "starter" 的限制,现在已经很老了,.NET 3.5.
为System.AppUserModel设置以下属性。
- System.AppUserModel.ID
- System.AppUserModel.RelaunchCommand
- System.AppUserModel.RelaunchDisplayNameResource
在 C# 中,您可以使用 Windows-API-Code-Pack or its NuGet package WindowsAPICodePack-Shell。
注意 unknown reason you can't easily change the path once it's set.
void SetTaskbarRelaunchCommand(Form form)
{
// WARNING, once RelaunchCommand has been set it can't be changed for any given appID.
// Workaround: delete all links here related to our app.
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
// Source:
var appID = "MyAppID";
var path = @"C:\Program Files (x86)\MyApp\Updater.exe");
var handle = form.Handle;
var propGuid = new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}");
var ID = new PropertyKey(propGuid, 5); // System.AppUserModel.ID
var RelaunchCommand = new PropertyKey(propGuid, 2); // System.AppUserModel.RelaunchCommand
var RelaunchDisplayNameResource = new PropertyKey(propGuid, 4); // System.AppUserModel.RelaunchDisplayNameResource
WindowProperties.SetWindowProperty(handle, ID, appID);
WindowProperties.SetWindowProperty(handle, RelaunchCommand, path);
WindowProperties.SetWindowProperty(handle, RelaunchDisplayNameResource, "Label of My App");
}
您还可以完全阻止应用固定。 由于 opposed to RelaunchCommand 您可以随时更改此值。
void PreventPinning(IntPtr handle)
{
var appID = "MyAppNoPin";
var propGuid = new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}");
var ID = new PropertyKey(propGuid, 5); // System.AppUserModel.ID
var PreventPinning = new PropertyKey(propGuid, 9); // System.AppUserModel.PreventPinning
//Important: Set PreventPinning before ID
WindowProperties.SetWindowProperty(handle, PreventPinning, "True");
WindowProperties.SetWindowProperty(handle, ID, appID);
}
我在最新的 Windows 10 更新中未能成功设置 RelaunchCommand 和 RelaunchDisplayNameResource。但是我找到了一个解决方案,使用您的第一种方法将启动器固定到任务栏,设置一个通用的 AppID:Pinning to the taskbar a "chained process"