使用C#将* .lnk文件固定到Windows 7任务栏

时间:2011-07-29 11:00:04

标签: c# windows-7 taskbar

即使是Windows 7中图标的程序化固定似乎也是不允许的(就像它在这里说的那样:http://msdn.microsoft.com/en-us/library/dd378460(v=VS.85).aspx),有一些方法可以通过使用一些VB脚本来实现。 有人在C#中找到了这样做的方法:

private static void PinUnpinTaskBar(string filePath, bool pin)
{
     if (!File.Exists(filePath)) throw new FileNotFoundException(filePath);

     // create the shell application object
     dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

     string path = Path.GetDirectoryName(filePath);
     string fileName = Path.GetFileName(filePath);

     dynamic directory = shellApplication.NameSpace(path);
     dynamic link = directory.ParseName(fileName);

     dynamic verbs = link.Verbs();
     for (int i = 0; i < verbs.Count(); i++)
        {
            dynamic verb = verbs.Item(i);
            string verbName = verb.Name.Replace(@"&", string.Empty).ToLower();

            if ((pin && verbName.Equals("pin to taskbar")) || (!pin && verbName.Equals("unpin from taskbar")))
            {

                verb.DoIt();
            }
        }

        shellApplication = null;
}

可以看出,代码使用了.NET Framework 4.0功能。我想问的问题是:这个函数可以转换,所以它会做同样的事情,但只使用3.5框架?有什么想法吗?

4 个答案:

答案 0 :(得分:8)

...简单

    private static void PinUnpinTaskBar(string filePath, bool pin) {
        if (!File.Exists(filePath)) throw new FileNotFoundException(filePath);

        // create the shell application object
        Shell shellApplication = new ShellClass();

        string path = Path.GetDirectoryName(filePath);
        string fileName = Path.GetFileName(filePath);

        Folder directory = shellApplication.NameSpace(path);
        FolderItem link = directory.ParseName(fileName);

        FolderItemVerbs verbs = link.Verbs();
        for (int i = 0; i < verbs.Count; i++) {
            FolderItemVerb verb = verbs.Item(i);
            string verbName = verb.Name.Replace(@"&", string.Empty).ToLower();

            if ((pin && verbName.Equals("pin to taskbar")) || (!pin && verbName.Equals("unpin from taskbar"))) {

                verb.DoIt();
            }
        }

        shellApplication = null;
    }

请务必向“Microsoft Shell控件和自动化”添加COM引用。

如果你想保留使用Activator.CreateInstance的现有方法,那么你不必拥有额外的COM互操作DLL,那么你将不得不使用反射。但这会使代码变得更加丑陋。

答案 1 :(得分:5)

无论Windows用户使用什么本地化:

        int MAX_PATH = 255;
        var actionIndex = pin ? 5386 : 5387; // 5386 is the DLL index for"Pin to Tas&kbar", ref. http://www.win7dll.info/shell32_dll.html
        StringBuilder szPinToStartLocalized = new StringBuilder(MAX_PATH);
        IntPtr hShell32 = LoadLibrary("Shell32.dll");
        LoadString(hShell32, (uint)actionIndex, szPinToStartLocalized, MAX_PATH);
        string localizedVerb = szPinToStartLocalized.ToString();

        // create the shell application object
        dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

        string path = Path.GetDirectoryName(filePath);
        string fileName = Path.GetFileName(filePath);

        dynamic directory = shellApplication.NameSpace(path);
        dynamic link = directory.ParseName(fileName);

        dynamic verbs = link.Verbs();
        for (int i = 0; i < verbs.Count(); i++)
        {
            dynamic verb = verbs.Item(i);

            if ((pin && verb.Name.Equals(localizedVerb)) || (!pin && verb.Name.Equals(localizedVerb)))
            {
                verb.DoIt();
                break;
            }
        }

答案 2 :(得分:3)

在Windows 10中,上述方法无法正常工作。 &#34;固定到任务栏&#34;动词不会出现在程序的列表中,仅在资源管理器中出现。为了在Windows 10中工作,您有两种选择。将程序重命名为explorer.exe,或者您必须欺骗对象以认为您的程序名为explorer.exe。您必须找到PEB并更改图像路径字段。我写了一篇关于如何做的帖子here

答案 3 :(得分:0)

使用Fall Creators Update(内部版本16299或更高版本)对在Windows 10上运行的UWP应用进行更新:

  

您可以以编程方式将自己的应用程序固定到任务栏,就像可以将应用程序固定到“开始”菜单一样。然后,您可以检查您的应用当前是否已固定,以及任务栏是否允许固定。

您可以直接以described in MS docs的身份访问TaskbarManager API。

我想使用WinForms应用程序执行此操作,但由于我无法引用Windows.Foundation API,因此它似乎无法正常工作。