Я работаю с парой программ, «стартер» (апдейтер) и «основная» программа. Где стартер обновляет и запускает main.
Программа должна корректно вести себя при закреплении на панели задач Windows или в меню «Пуск». Например, пользователь должен иметь возможность:
Можно ли сделать так, чтобы закрепленный ярлык указывал на «стартер», а не на «основной» напрямую?
Я пробовал сгруппировать их по общему идентификатору, но это не влияет на закрепляемый путь.
Прямо сейчас я загружаю «основной» в процессе «стартер». Это работает, как и ожидалось, но есть проблема, заключающаяся в том, что все обновления ограничены версией .NET «starter», которая сейчас становится довольно старой, .NET 3.5.
Установите следующие свойства для System.AppUserModel.
В C# вы можете использовать Windows-API-код-пакет или его пакет NuGet WindowsAPICodePack-Shell.
Обратите внимание, что для неизвестная причина, по которой вы не можете легко изменить путь после его установки.
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: https://stackoverflow.com/a/28388958/33236
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");
}
Вы также можете предотвратить полное закрепление приложения. Как в отличие от 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);
}
Мне не удалось установить RelaunchCommand и RelaunchDisplayNameResource в новейшем обновлении Windows 10. Но я нашел решение установить, что Launcher закреплен на панели задач, используя ваш первый подход, установив общий AppID: Закрепление на панели задач «связанного процесса»
Используйте свойство Relaunch Command, чтобы настроить то, что запускается. docs.microsoft.com/en-us/windows/desktop/properties/…