微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以通过.Net获得与安装的打印机相关的图标吗?

我知道如何获得所有已安装的打印机在.Net机器上的列表:

foreach (String printer in PrinterSettings.InstalledPrinters) { Console.WriteLine(printer.ToString()); } Console.ReadLine();

InstalledPrinters只是一个string列表。 有没有办法让安装的打印机对象同时包含我通常在Windows资源pipe理器中的“设备和打印机”下看到的名称和图标图像?

识别Windows机器上的空闲状态

无法build立应用程序安装程序

如何将外部非Windows手机类库项目引用添加到Windows Phone项目?

如何检测串口是否在使用.net

写入Windows应用程序事件日志,无需注册事件源

该图标通常嵌入到任何一个dll文件或主EXE中,查看System.Drawing.Icon静态方法,下面的链接用于WinForms,与WPF略有不同,因为您必须从提取的图像中创建ImageSource图标流。

如何:在Windows窗体中提取文件关联的图标

这个任务的C#代码

public static class PrinterIcons { public static Dictionary<string,Icon> GetPrintersWithIcons(IntPtr hwndOwner) { Dictionary<string,Icon> result = new Dictionary<string,Icon>(); Shell32.IShellFolder iDesktopFolder = Shell32.GetDesktopFolder(); try { IntPtr pidlPrintersFolder; if (Shell32.SHGetFolderLocation(hwndOwner,(int)Shell32.CSIDL.CSIDL_PRINTERS,IntPtr.Zero,out pidlPrintersFolder) == 0) try { StringBuilder strdisplay = new StringBuilder(260); Guid guidishellFolder = Shell32.IID_IShellFolder; IntPtr ptrPrinteRSShellFolder; iDesktopFolder.BindToObject(pidlPrintersFolder,ref guidishellFolder,out ptrPrinteRSShellFolder); Object objPrinteRSShellFolder = Marshal.GetTypedobjectForIUnkNown(ptrPrinteRSShellFolder,Shell32.ShellFolderType); try { Shell32.IShellFolder printeRSShellFolder = (Shell32.IShellFolder)objPrinteRSShellFolder; IntPtr ptrObjectsList; printeRSShellFolder.EnumObjects(hwndOwner,Shell32.ESHCONTF.SHCONTF_NONFOLDERS,out ptrObjectsList); Object objEnumIDList = Marshal.GetTypedobjectForIUnkNown(ptrObjectsList,Shell32.EnumIDListType); try { Shell32.IEnumIDList iEnumIDList = (Shell32.IEnumIDList)objEnumIDList; IntPtr[] rgelt = new IntPtr[1]; IntPtr pidlPrinter; int pceltFetched; Shell32.STRRET ptrString; while (iEnumIDList.Next(1,rgelt,out pceltFetched) == 0 && pceltFetched == 1) { printeRSShellFolder.GetdisplayNameOf(rgelt[0],Shell32.ESHGDN.SHGDN_norMAL,out ptrString); if (Shell32.StrRetToBuf(ref ptrString,rgelt[0],strdisplay,(uint)strdisplay.Capacity) == 0) { pidlPrinter = Shell32.ILCombine(pidlPrintersFolder,rgelt[0]); string printerdisplayNameInPrintersFolder = strdisplay.ToString(); Shell32.SHFILEINFO shinfo = new Shell32.SHFILEINFO(); Shell32.SHGetFileInfo(pidlPrinter,out shinfo,(uint)Marshal.SizeOf(shinfo),Shell32.SHGFI.PIDL | Shell32.SHGFI.AddOverlays | Shell32.SHGFI.Icon); Icon printerIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone(); Shell32.DestroyIcon(shinfo.hIcon); result.Add(printerdisplayNameInPrintersFolder,printerIcon); } } } finally { Marshal.ReleaseComObject(objEnumIDList); } } finally { Marshal.ReleaseComObject(objPrinteRSShellFolder); } } finally { Shell32.ILFree(pidlPrintersFolder); } } finally { Marshal.ReleaseComObject(iDesktopFolder); } return result; } }

请注意,结果字典中的打印机名称将是Printers shell文件夹中显示的打印机名称,它们可能与PrinterSettings类中使用的打印机名称不同(例如,Printers shell文件夹中的网络打印机可能显示为“on”单词“on”取决于windows的本地化,可以不是机器网络名称)。 我还不知道如何从IShellFolder获得“真正的”打印机名称,以便将其与PrinterSettings类一起使用。

无论如何,这个代码加载打印机系统图标,所以你可以使用它为你的任务。

Upd:在这代码中使用的Shell32类的代码可以在这里找到(太大的答案): http ://pastebin.com/thJuWx45

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐