Windows任务栏中和开始菜单中用于固定exe的控制路径

时间:2019-04-06 15:48:45

标签: c# taskbar

我正在使用一对程序,“启动程序”(更新程序)和“主程序”。 入门程序在哪里更新和启动。

固定到Windows任务栏或开始菜单时,程序必须表现良好。 例如,用户应该能够:

  1. 启动“启动器”
  2. 将正在运行的“ main”固定到任务栏上
  3. 关闭程序
  4. 使用任务栏上的固定项目启动程序。

是否可以将固定的快捷方式指向“启动器”而不是直接指向“主”?

我尝试过group them using a common ID,但这并不影响固定的路径。

现在,我正在“启动程序”的过程中加载“主”文件。 这可以按预期工作,但是存在所有更新受.NET版本“ starter”限制的问题,而该版本现在已经很老,.NET 3.5。

2 个答案:

答案 0 :(得分:0)

System.AppUserModel设置以下属性。

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

在C#中,您可以使用Windows-API-Code-Pack或其NuGet软件包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: 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");
}

您还可以阻止将应用完全固定。 作为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);
}

答案 1 :(得分:0)

我未能在最新的Windows 10更新上设置RelaunchCommand和RelaunchDisplayNameResource。但是我找到了一种解决方案,可以使用第一种方法来设置启动器固定在任务栏上,并设置通用的AppID:Pinning to the taskbar a "chained process"