获取所有可用打印机驱动程序列表(例如添加打印机向导)

5
在c#中,我可以获取运行系统上安装的所有打印机驱动程序列表,就像Windows "添加打印机"向导一样:
我已经能够列出已安装的打印机,但如何列出系统中可用的驱动程序?

这个向导程序并不列出已安装的打印机驱动程序,它包括可能被安装的驱动程序。 这种功能被深埋在设置 API 中。 从.NET使用非常困难,PInvoke很糟糕。而且一般来说这不是一个简单的API。http://msdn.microsoft.com/en-us/library/windows/hardware/ff553567%28v=vs.85%29.aspx - Hans Passant
非常感谢您的回复。我想我宁愿避免... - T. Phanelly
2个回答

0

这段代码枚举了安装的打印机驱动程序:

public struct DRIVER_INFO_2
{
    public uint cVersion;
    [MarshalAs(UnmanagedType.LPTStr)] public string pName;
    [MarshalAs(UnmanagedType.LPTStr)] public string pEnvironment;
    [MarshalAs(UnmanagedType.LPTStr)] public string pDriverPath;
    [MarshalAs(UnmanagedType.LPTStr)] public string pDataFile;
    [MarshalAs(UnmanagedType.LPTStr)] public string pConfigFile;
}


public static class EnumeratePrinterDriverNames
{
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int EnumPrinterDrivers(String pName, String pEnvironment, uint level, IntPtr pDriverInfo,
        uint cdBuf, ref uint pcbNeeded, ref uint pcRetruned);

    public static IEnumerable<string> Enumerate()
    {
        const int ERROR_INSUFFICIENT_BUFFER = 122;

        uint needed = 0;
        uint returned = 0;
        if (EnumPrinterDrivers(null, null, 2, IntPtr.Zero, 0, ref needed, ref returned) != 0)
        {
            //succeeds, but shouldn't, because buffer is zero (too small)!
            throw new ApplicationException("EnumPrinters should fail!");
        }

        int lastWin32Error = Marshal.GetLastWin32Error();
        if (lastWin32Error != ERROR_INSUFFICIENT_BUFFER)
        {
            throw new Win32Exception(lastWin32Error);
        }

        IntPtr address = Marshal.AllocHGlobal((IntPtr) needed);
        try
        {
            if (EnumPrinterDrivers(null, null, 2, address, needed, ref needed, ref returned) == 0)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            var type = typeof (DRIVER_INFO_2);
            IntPtr offset = address;
            int increment = Marshal.SizeOf(type);

            for (uint i = 0; i < returned; i++)
            {
                var di = (DRIVER_INFO_2) Marshal.PtrToStructure(offset, type);
                offset += increment;

                yield return di.pName;
            }
        }
        finally
        {
            Marshal.FreeHGlobal(address);
        }
    }
}

0

1
这将检索已安装的打印机列表,而不是可用的驱动程序。 - larsmoa
或者您不想获取已安装的打印机,而是想获取所有可用的打印机? - Burucsb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接