其实你已经有了答案! 问题在于Windows中的动词是针对文件类型进行配置的。您还没有指定的文件类型你要找的人,所以我对一些常见的类型我的机器上运行你的代码,从一个捷径,这就是明显的一个引脚
方式(.lnk)C :\ ProgramData \微软\的Windows \开始菜单\程序\展望2016.lnk
Verb Search: &Open
Verb Search: Open file locat&ion
Verb Search: Run as &administrator
Verb Search: Troubleshoot compatibilit&y
Verb Search: &Pin to Start
Verb Search: Scan with Windows Defender...
Verb Search: Restore previous &versions
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Search: &Delete
Verb Search: Rena&me
Verb Search: P&roperties
现在如果我在一个文本文件相同:
文件(.txt)\\ PDC \ Folder Redirection \ chris \ Documents \ who knows.txt
Verb Search: &Open
Verb Search: &Print
Verb Search: &Edit
Verb Search: Scan with Windows Defender...
Verb Search:
Verb Search: Restore previous &versions
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Search: &Delete
Verb Search: Rena&me
Verb Search: P&roperties
现在,如果我运行相同的文件夹:
(目录)\\ PDC \文件夹重定向\克里斯\文件
Verb Search: &Open
Verb Search: Pin to Quick access
Verb Search: Open in &Visual Studio
Verb Search: Scan with Windows Defender...
Verb Search: Restore previous &versions
Verb Search: &Pin to Start
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Search: &Delete
Verb Search: Rena&me
Verb Search: P&roperties
都到哪儿去这些难以捉摸的动词配置?在注册表中。请参阅:
MSDN: Verbs and File Associations
Registering Verbs for File Name Extensions
注意:如果要固定不支持钉住它不是那么简单,创建快捷方式到该文件的文件......我想,就在现在,窗户仍然显示快捷方式目标的动词!但这是有道理的,因为对于Windows跳转列表,我们通常会固定用于打开项目的程序,然后我们可以将该项目固定在该程序的跳转列表中。
只是为了好玩,我已经添加了我的代码探索以尝试创建快捷方式,以防其他人找到它的用途。我还更改了日志语句,以便从具有有限引用的控制台应用程序运行此日志语句。
using Shell32; // Add COM reference to Microsoft Shell controls and Automation
static class Program
{
public const string PIN_TO_START = "&Pin to Start";
public const string CREATE_SHORTCUT = "Create &shortcut";
[STAThread]
static void Main()
{
// Test with a text file, text files do not have "Pin to Start" as a standard verb
string path = @"\\PDC\Folder Redirection\chris\Documents\who knows.txt";
string localizedVerb = "&Pin to Start";
if (ExecuteShellVerb(path, localizedVerb))
Debug.WriteLine($"Verb '{localizedVerb}' executed on {path}");
else if (localizedVerb.Equals(PIN_TO_START))
{
// Create a shortcut to the item, by cheating with the Create Shortcut verb :)
// You could do this a number of ways, this is just one idea to point you in the right direction
if (ExecuteShellVerb(path, CREATE_SHORTCUT))
{
// by default the shortcut name will be the same as the item, but with a ' - Shortcut.lnk' appended
// You know how windows naming conventions work and what the possibilities are here :)
string shortcutPath = $"{path} - Shortcut.lnk";
Debug.WriteLine($"Created Shortcut: {shortcutPath}");
if (ExecuteShellVerb(shortcutPath, localizedVerb))
Debug.WriteLine($"Verb '{localizedVerb}' executed on {shortcutPath}");
else
Debug.WriteLine($"Failed to execute verb '{localizedVerb}' on the created shortcut: {shortcutPath}");
}
else
{
Debug.WriteLine($"Failed to create Shortcut using verb.");
// TODO: create the shortcut manually
}
}
}
private static bool ExecuteShellVerb(string filePath, string localizedVerb)
{
Shell shellApplication = new ShellClass();
string path = Path.GetDirectoryName(filePath);
string fileName = Path.GetFileName(filePath);
Folder directory = GetShell32NameSpaceFolder(path);
FolderItem link = directory.ParseName(fileName);
FolderItemVerbs verbs = link.Verbs();
for (var i = 0; i < verbs.Count; i++)
{
FolderItemVerb verb = verbs.Item(i);
Debug.WriteLine("Verb Search: " + verb.Name);
if (verb.Name.Equals(localizedVerb))
{
Debug.WriteLine("Verb Found: " + verb.Name);
verb.DoIt();
return true;
}
}
return false;
}
public static Shell32.Folder GetShell32NameSpaceFolder(Object folder)
{
Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
return (Shell32.Folder)shellAppType.InvokeMember("NameSpace",
System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
}
}
而从这个运行的输出:
Verb Search: &Open
Verb Search: &Print
Verb Search: &Edit
Verb Search: Scan with Windows Defender...
Verb Search:
Verb Search: Restore previous &versions
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Search: &Delete
Verb Search: Rena&me
Verb Search: P&roperties
Verb Search: &Open
Verb Search: &Print
Verb Search: &Edit
Verb Search: Scan with Windows Defender...
Verb Search:
Verb Search: Restore previous &versions
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Found: Create &shortcut
Created Shortcut: \\PDC\Folder Redirection\chris\Documents\who knows.txt - Shortcut.lnk
Verb Search: &Open
Verb Search: Open file locat&ion
Verb Search: &Print
Verb Search: &Edit
Verb Search: Scan with Windows Defender...
Verb Search:
Verb Search: Restore previous &versions
Verb Search:
Verb Search: Cu&t
Verb Search: &Copy
Verb Search: Create &shortcut
Verb Search: &Delete
Verb Search: Rena&me
Verb Search: P&roperties
Failed to execute verb '&Pin to Start' on the created shortcut: \\PDC\Folder Redirection\chris\Documents\who knows.txt - Shortcut.lnk
我是一个.lnk文件类型后,但我没有得到引脚使用win10 3.5代码启动选项。你是否得到Pin开始在win10机器上使用3.5代码和.lnk文件? – nlstack01
是的,我在Win 10 .Net 3.5上运行了这个... .Net的版本并没有影响到这个,所以忽略了这个。 (.Net会影响你使用的命名空间和工具,动词值来自Windows运行时)所以现在在Windows直接尝试它,当你右键点击一个.lnk文件时,你是否可以选择“Pin to Start”?这就是你所有的代码都正确,上下文菜单调用相同的子系统。因此,如果Pin to Start对于普通用户不可用,则必须检查注册表设置以确保该动词实际上已在您的计算机上注册以便引脚启动。有关信息,请参阅答案中的链接。 –