Путь к закрепленному файлу в панели задач Windows и меню «Пуск» - PullRequest
2 голосов
/ 06 апреля 2019

Я работаю с парой программ: «стартер» (апдейтер) и «основная» программа. Где стартер обновляет и запускает главное.

Программа должна вести себя хорошо при закреплении на панели задач Windows или в меню «Пуск». Например, пользователь должен иметь возможность:

  1. Старт "стартер"
  2. Закрепить работающую "главную" на панели задач
  3. Закрыть программу
  4. Запуск программы с использованием закрепленного элемента на панели задач.

Можно ли сделать закрепленный ярлык точкой для «стартера», а не для «главного» напрямую?

Я пытался сгруппировать их, используя общий идентификатор , но это не влияет на закрепляемый путь.

Прямо сейчас я загружаю "main" в процессе "startter". Это работает, как и ожидалось, но проблема в том, что все обновления ограничены .NET-версией «Starter», которая в настоящее время становится довольно старой, .NET 3.5.

1 Ответ

0 голосов
/ 07 апреля 2019

Установите следующие свойства для System.AppUserModel .

  • System.AppUserModel.ID
  • System.AppUserModel.RelaunchCommand
  • System.AppUserModel.RelaunchDisplayNameResource

В C # вы можете использовать Windows-API-Code-Pack или его пакет 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);
}
...