C# 获取在c中与ProcessStartInfo一起使用的可用谓词(文件关联)列表#

C# 获取在c中与ProcessStartInfo一起使用的可用谓词(文件关联)列表#,c#,file-association,processstartinfo,C#,File Association,Processstartinfo,我正在尝试使用ProcessStartInfo类打开和打印文件。(文件可以是任何东西,但假设它是PDF文件) 这适用于pi.Verb=“OPEN”。有些应用程序也使用动词“PRINT”进行注册,但只有一些应用程序这样做。在我的例子(Windows PDF Viewer)中,当尝试使用pi.Verb=“PRINT”执行时出现异常 有没有办法在运行时查看C#中特定类型的所有可用动词 来自MSDN的Thx大量: > PurrestSistFiel.动词< /Cord>属性有点损坏,因为它不考虑新版

我正在尝试使用ProcessStartInfo类打开和打印文件。(文件可以是任何东西,但假设它是PDF文件)

这适用于
pi.Verb=“OPEN”。有些应用程序也使用动词“PRINT”进行注册,但只有一些应用程序这样做。在我的例子(Windows PDF Viewer)中,当尝试使用
pi.Verb=“PRINT”执行时出现异常

有没有办法在运行时查看C#中特定类型的所有可用动词

来自MSDN的Thx大量


<> > <代码> PurrestSistFiel.动词< /Cord>属性有点损坏,因为它不考虑新版本的Windows(Windows 8及以上AFAIK)如何检索已注册的应用程序。该属性仅检查在<代码> HKCR\Ext/Cube >(如可以看到)中定义的PROFIDES的动词,而不考虑其他地方,例如注册表项“代码”> HKEY、CurrnTyAuth[Suff\\Studio\\Windows \\CurrorVistor\Explorer \FielExt\Ext/Corp>或其他一些地方,例如通过策略定义。

获取注册动词 最好的方法不是直接检查注册表(由
ProcessStartInfo
类完成),而是使用适当的Windows API函数检索相关的ProgId:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;

class Program
{
    private static void Main(string[] args)
    {
        string fileName = @"E:\Pictures\Sample.jpg";
        string progId = AssocQueryString(AssocStr.ASSOCSTR_PROGID, fileName);

        var verbs = GetVerbsByProgId(progId);

        if (!verbs.Contains("printto"))
        {
            throw new Exception("PrintTo is not supported!");
        }

    }

    private static string[] GetVerbsByProgId(string progId)
    {
        var verbs = new List<string>();

        if (!string.IsNullOrEmpty(progId))
        {
            using (var key = Registry.ClassesRoot.OpenSubKey(progId + "\\shell"))
            {
                if (key != null)
                {
                    var names = key.GetSubKeyNames();
                    verbs.AddRange(
                        names.Where(
                            name => 
                                string.Compare(
                                    name, 
                                    "new", 
                                    StringComparison.OrdinalIgnoreCase) 
                                != 0));
                }
            }
        }

        return verbs.ToArray();
    }

    private static string AssocQueryString(AssocStr association, string extension)
    {
        uint length = 0;
        uint ret = AssocQueryString(
            AssocF.ASSOCF_NONE, association, extension, "printto", null, ref length);
        if (ret != 1) //expected S_FALSE
        {
            throw new Win32Exception();
        }

        var sb = new StringBuilder((int)length);
        ret = AssocQueryString(
            AssocF.ASSOCF_NONE, association, extension, null, sb, ref length);
        if (ret != 0) //expected S_OK
        {
            throw new Win32Exception();
        }

        return sb.ToString();
    }

    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern uint AssocQueryString(
        AssocF flags,
        AssocStr str,
        string pszAssoc,
        string pszExtra,
        [Out] StringBuilder pszOut,
        ref uint pcchOut);

    [Flags]
    private enum AssocF : uint
    {
        ASSOCF_NONE = 0x00000000,
        ASSOCF_INIT_NOREMAPCLSID = 0x00000001,
        ASSOCF_INIT_BYEXENAME = 0x00000002,
        ASSOCF_OPEN_BYEXENAME = 0x00000002,
        ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004,
        ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008,
        ASSOCF_NOUSERSETTINGS = 0x00000010,
        ASSOCF_NOTRUNCATE = 0x00000020,
        ASSOCF_VERIFY = 0x00000040,
        ASSOCF_REMAPRUNDLL = 0x00000080,
        ASSOCF_NOFIXUPS = 0x00000100,
        ASSOCF_IGNOREBASECLASS = 0x00000200,
        ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400,
        ASSOCF_INIT_FIXED_PROGID = 0x00000800,
        ASSOCF_IS_PROTOCOL = 0x00001000,
        ASSOCF_INIT_FOR_FILE = 0x00002000
    }

    private enum AssocStr
    {
        ASSOCSTR_COMMAND = 1,
        ASSOCSTR_EXECUTABLE,
        ASSOCSTR_FRIENDLYDOCNAME,
        ASSOCSTR_FRIENDLYAPPNAME,
        ASSOCSTR_NOOPEN,
        ASSOCSTR_SHELLNEWVALUE,
        ASSOCSTR_DDECOMMAND,
        ASSOCSTR_DDEIFEXEC,
        ASSOCSTR_DDEAPPLICATION,
        ASSOCSTR_DDETOPIC,
        ASSOCSTR_INFOTIP,
        ASSOCSTR_QUICKTIP,
        ASSOCSTR_TILEINFO,
        ASSOCSTR_CONTENTTYPE,
        ASSOCSTR_DEFAULTICON,
        ASSOCSTR_SHELLEXTENSION,
        ASSOCSTR_DROPTARGET,
        ASSOCSTR_DELEGATEEXECUTE,
        ASSOCSTR_SUPPORTED_URI_PROTOCOLS,
        ASSOCSTR_PROGID,
        ASSOCSTR_APPID,
        ASSOCSTR_APPPUBLISHER,
        ASSOCSTR_APPICONREFERENCE,
        ASSOCSTR_MAX
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统诊断;
使用System.Linq;
使用System.Runtime.InteropServices;
使用系统文本;
使用Microsoft.Win32;
班级计划
{
私有静态void Main(字符串[]args)
{
字符串文件名=@“E:\Pictures\Sample.jpg”;
字符串progId=AssocQueryString(AssocStr.AssocStr_progId,文件名);
变量动词=GetVerbsByProgId(progId);
如果(!verbs.Contains(“printto”))
{
抛出新异常(“不支持PrintTo!”);
}
}
私有静态字符串[]GetVerbsByProgId(字符串progId)
{
var动词=新列表();
如果(!string.IsNullOrEmpty(progId))
{
使用(var key=Registry.ClassesRoot.OpenSubKey(progId+“\\shell”))
{
if(key!=null)
{
var name=key.GetSubKeyNames();
动词.AddRange(
名字,在哪里(
名称=>
字符串。比较(
名称
“新”,
StringComparison.OrdinalingoreCase)
!= 0));
}
}
}
返回动词。ToArray();
}
私有静态字符串AssocQueryString(AssocStr关联,字符串扩展名)
{
uint长度=0;
uint ret=AssocQueryString(
AssocF.AssocF_NONE,关联,扩展,“printto”,null,参考长度);
if(ret!=1)//预期S_为FALSE
{
抛出新的Win32Exception();
}
var sb=新的StringBuilder((int)长度);
ret=AssocQueryString(
AssocF.AssocF_无、关联、扩展、空、sb、参考长度);
if(ret!=0)//预期S_正常
{
抛出新的Win32Exception();
}
使某人返回字符串();
}
[DllImport(“Shlwapi.dll”,CharSet=CharSet.Unicode,SetLastError=true)]
私有静态外部单元关联(
AssocF旗帜,
AssocStr str,
字符串pszAssoc,
字符串pszExtra,
[Out]StringBuilder pszOut,
参考uint pcchOut);
[旗帜]
私有枚举关联:uint
{
ASSOCF_NONE=0x00000000,
ASSOCF_INIT_NOREMAPCLSID=0x00000001,
ASSOCF_INIT_BYEXENAME=0x00000002,
ASSOCF_OPEN_BYEXENAME=0x00000002,
ASSOCF_INIT_DEFAULTTOSTAR=0x00000004,
ASSOCF_INIT_DEFAULTTOFOLDER=0x00000008,
ASSOCF_NOUSERSETTINGS=0x00000010,
ASSOCF_NOTRUNCATE=0x00000020,
ASSOCF_VERIFY=0x00000040,
ASSOCF_REMAPRUNDLL=0x00000080,
ASSOCF_NOFIXUPS=0x00000100,
ASSOCF_IGNOREBASECLASS=0x00000200,
ASSOCF_INIT_IGNOREUNKNOWN=0x00000400,
ASSOCF_INIT_FIXED_PROGID=0x0000800,
ASSOCF_是_协议=0x00001000,
文件的ASSOCF_INIT_=0x00002000
}
私有枚举关联
{
ASSOCSTR_命令=1,
ASSOCSTR_可执行文件,
ASSOCSTR_FRIENDLYDOCNAME,
ASSOCSTR_FRIENDLYAPPNAME,
阿索克斯特鲁努蓬,
ASSOCSTR_SHELLNEWVALUE,
联合指挥部,
助理首席执行官,
ASSOCSTR\U应用程序,
联合主题,
ASSOCSTR_信息提示,
快速提示助理,
国际信息协会,
ASSOCSTR_CONTENTTYPE,
ASSOCSTR_默认图标,
ASSOCSTR_SHELLEXTENSION,
阿索克斯特鲁·杜普塔,
授权执行助理,
ASSOCSTR_支持的_URI_协议,
ASSOCSTR_PROGID,
助理秘书长,
联合出版公司,
ASSOCSTR_APPICONREFERENCE,
阿索克斯特鲁马克斯酒店
}
}

哦,天哪,真的没想到他们会让它这么容易使用。Thx很多
 startInfo = new ProcessStartInfo(fileName);

    if (File.Exists(fileName))
    {
        i = 0;
        foreach (String verb in startInfo.Verbs)
        {
            // Display the possible verbs.
            Console.WriteLine("  {0}. {1}", i.ToString(), verb);
            i++;
        }
    }
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;

class Program
{
    private static void Main(string[] args)
    {
        string fileName = @"E:\Pictures\Sample.jpg";
        string progId = AssocQueryString(AssocStr.ASSOCSTR_PROGID, fileName);

        var verbs = GetVerbsByProgId(progId);

        if (!verbs.Contains("printto"))
        {
            throw new Exception("PrintTo is not supported!");
        }

    }

    private static string[] GetVerbsByProgId(string progId)
    {
        var verbs = new List<string>();

        if (!string.IsNullOrEmpty(progId))
        {
            using (var key = Registry.ClassesRoot.OpenSubKey(progId + "\\shell"))
            {
                if (key != null)
                {
                    var names = key.GetSubKeyNames();
                    verbs.AddRange(
                        names.Where(
                            name => 
                                string.Compare(
                                    name, 
                                    "new", 
                                    StringComparison.OrdinalIgnoreCase) 
                                != 0));
                }
            }
        }

        return verbs.ToArray();
    }

    private static string AssocQueryString(AssocStr association, string extension)
    {
        uint length = 0;
        uint ret = AssocQueryString(
            AssocF.ASSOCF_NONE, association, extension, "printto", null, ref length);
        if (ret != 1) //expected S_FALSE
        {
            throw new Win32Exception();
        }

        var sb = new StringBuilder((int)length);
        ret = AssocQueryString(
            AssocF.ASSOCF_NONE, association, extension, null, sb, ref length);
        if (ret != 0) //expected S_OK
        {
            throw new Win32Exception();
        }

        return sb.ToString();
    }

    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern uint AssocQueryString(
        AssocF flags,
        AssocStr str,
        string pszAssoc,
        string pszExtra,
        [Out] StringBuilder pszOut,
        ref uint pcchOut);

    [Flags]
    private enum AssocF : uint
    {
        ASSOCF_NONE = 0x00000000,
        ASSOCF_INIT_NOREMAPCLSID = 0x00000001,
        ASSOCF_INIT_BYEXENAME = 0x00000002,
        ASSOCF_OPEN_BYEXENAME = 0x00000002,
        ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004,
        ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008,
        ASSOCF_NOUSERSETTINGS = 0x00000010,
        ASSOCF_NOTRUNCATE = 0x00000020,
        ASSOCF_VERIFY = 0x00000040,
        ASSOCF_REMAPRUNDLL = 0x00000080,
        ASSOCF_NOFIXUPS = 0x00000100,
        ASSOCF_IGNOREBASECLASS = 0x00000200,
        ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400,
        ASSOCF_INIT_FIXED_PROGID = 0x00000800,
        ASSOCF_IS_PROTOCOL = 0x00001000,
        ASSOCF_INIT_FOR_FILE = 0x00002000
    }

    private enum AssocStr
    {
        ASSOCSTR_COMMAND = 1,
        ASSOCSTR_EXECUTABLE,
        ASSOCSTR_FRIENDLYDOCNAME,
        ASSOCSTR_FRIENDLYAPPNAME,
        ASSOCSTR_NOOPEN,
        ASSOCSTR_SHELLNEWVALUE,
        ASSOCSTR_DDECOMMAND,
        ASSOCSTR_DDEIFEXEC,
        ASSOCSTR_DDEAPPLICATION,
        ASSOCSTR_DDETOPIC,
        ASSOCSTR_INFOTIP,
        ASSOCSTR_QUICKTIP,
        ASSOCSTR_TILEINFO,
        ASSOCSTR_CONTENTTYPE,
        ASSOCSTR_DEFAULTICON,
        ASSOCSTR_SHELLEXTENSION,
        ASSOCSTR_DROPTARGET,
        ASSOCSTR_DELEGATEEXECUTE,
        ASSOCSTR_SUPPORTED_URI_PROTOCOLS,
        ASSOCSTR_PROGID,
        ASSOCSTR_APPID,
        ASSOCSTR_APPPUBLISHER,
        ASSOCSTR_APPICONREFERENCE,
        ASSOCSTR_MAX
    }
}