2017-03-15 74 views
0

我正在尝试在.net 3.5中编写以下代码。该代码是通过动词试图环路(即附到'开始,打开,创建快捷方式等)Shell.Application Verbs .Net 3.5

此代码这在4.5

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

    // create the shell application object 
    dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); 
    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); 
     var name = verb.Name; 
     if (verb.Name.Equals(localizedVerb)) 
     { 
      verb.DoIt(); 
      return true; 
     } 
    } 

我试图在3.5这个代码转换为

 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); 

      logger.WriteDebug("Verb Search: " + verb.Name); 
      if (verb.Name.Equals(localizedVerb)) 
      { 
       logger.WriteDebug("Verb Found: " + verb.Name); 
       verb.DoIt(); 
       return true; 
      } 
     } 

这很有道理..它找到动词,但由于某种原因,不是“Pin开始”后的动词im。

如何将上述4.5代码翻译为3.5,以便找到win10(或至少win7)os的所有动词?

回答

1

其实你已经有了答案! 问题在于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 
+0

我是一个.lnk文件类型后,但我没有得到引脚使用win10 3.5代码启动选项。你是否得到Pin开始在win10机器上使用3.5代码和.lnk文件? – nlstack01

+0

是的,我在Win 10 .Net 3.5上运行了这个... .Net的版本并没有影响到这个,所以忽略了这个。 (.Net会影响你使用的命名空间和工具,动词值来自Windows运行时)所以现在在Windows直接尝试它,当你右键点击一个.lnk文件时,你是否可以选择“Pin to Start”?这就是你所有的代码都正确,上下文菜单调用相同的子系统。因此,如果Pin to Start对于普通用户不可用,则必须检查注册表设置以确保该动词实际上已在您的计算机上注册以便引脚启动。有关信息,请参阅答案中的链接。 –