Определить, закреплено ли приложение на панели задач

У меня есть приложение С#/WPF, которому я хочу дать различное поведение в зависимости от того, было ли оно запущено с закрепленной ссылки на панели задач Windows.

  1. Есть ли способ определить, закреплено ли мое приложение на панели задач?
  2. Есть ли способ определить, запущено ли мое приложение из закрепленного элемента на панели задач?

person Jan Rothkegel    schedule 27.02.2017    source источник
comment
codeproject.com/Articles/ 43768/   -  person Dirty Developer    schedule 27.02.2017


Ответы (1)


Вы можете определить, закреплено ли приложение на панели задач для текущего пользователя, проверив папку %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar, где хранятся ярлыки для всех закрепленных приложений. Например (необходимо добавить ссылку COM на объектную модель хоста сценариев Windows):

private static bool IsCurrentApplicationPinned() {
    // path to current executable
    var currentPath = Assembly.GetEntryAssembly().Location;            
    // folder with shortcuts
    string location = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar");
    if (!Directory.Exists(location))
        return false;

    foreach (var file in Directory.GetFiles(location, "*.lnk")) {
        IWshShell shell = new WshShell();
        var lnk = shell.CreateShortcut(file) as IWshShortcut;
        if (lnk != null) {  
            // if there is shortcut pointing to current executable - it's pinned                                    
            if (String.Equals(lnk.TargetPath, currentPath, StringComparison.InvariantCultureIgnoreCase)) {
                return true;
            }
        }
    }
    return false;
}

Существует также способ определить, было ли приложение запущено из закрепленного элемента или нет. Для этого вам понадобится GetStartupInfo функция win api. Помимо другой информации, он предоставит вам полный путь к ярлыку (или просто файлу), с которого был запущен текущий процесс. Пример:

[DllImport("kernel32.dll", SetLastError = true, EntryPoint = "GetStartupInfoA")]
public static extern void GetStartupInfo(out STARTUPINFO lpStartupInfo);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct STARTUPINFO
{
    public uint cb;
    public string lpReserved;
    public string lpDesktop;
    public string lpTitle;
    public uint dwX;
    public uint dwY;
    public uint dwXSize;
    public uint dwYSize;
    public uint dwXCountChars;
    public uint dwYCountChars;
    public uint dwFillAttribute;
    public uint dwFlags;
    public ushort wShowWindow;
    public ushort cbReserved2;
    public IntPtr lpReserved2;
    public IntPtr hStdInput;
    public IntPtr hStdOutput;
    public IntPtr hStdError;
}

Использование:

STARTUPINFO startInfo;
GetStartupInfo(out startInfo);
var startupPath = startInfo.lpTitle;

Теперь, если вы запустили приложение с панели задач, startupPath будет указывать на ярлык с %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar, поэтому со всей этой информацией легко проверить, было ли приложение запущено с панели задач или нет.

person Evk    schedule 27.02.2017