我怎样才能从设备和打印机的IShellFolder打印机名称? [英] How I can get printer name from device and printers IShellFolder?

查看:193
本文介绍了我怎样才能从设备和打印机的IShellFolder打印机名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到使用code系统的打印机图标(只有这样,我才发现 - 被使用的IShellFolder),现在我想他们InstalledPrinters连接,但问题是 - 我不能老是找办法找到真正的打印机名称(如\服务器\ PrinterName的),用的是不同的,以显示设备和打印机文件夹壳,只有正确使用PrinterSettings使用内容的名称。

I'm getting system printers icons using code (only way I found - is to use IShellFolder ), now I want to connect them with InstalledPrinters, but problem is - I can`t find way to find real printer name (such as "\ServerName\PrinterName" ), with is different to display name of content of "Devices and printers" shell folder and only correct to use with PrinterSettings.

在code我必须使用以检索打印机的图标和打印机标题中的设备和打印机外壳文件夹:

The code I have use to retrive printer icons and printer captions in "Devices and printers" shell folder:

    Shell32.IShellFolder iDesktopFolder = Shell32.GetDesktopFolder();
    try
    {
        IntPtr pidlPrintersFolder;
        if (Shell32.SHGetFolderLocation(_hwndOwner, (int)Shell32.CSIDL.CSIDL_PRINTERS, IntPtr.Zero, 0, out pidlPrintersFolder) == 0)
            try
            {
                StringBuilder strDisplay = new StringBuilder(260);
                Guid guidIShellFolder = Shell32.IID_IShellFolder;
                IntPtr ptrPrintersShellFolder;
                iDesktopFolder.BindToObject(pidlPrintersFolder, IntPtr.Zero, 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 printerDisplayName = strDisplay.ToString();

                                Shell32.SHFILEINFO shinfo = new Shell32.SHFILEINFO();
                                Shell32.SHGetFileInfo(this._pidl, 0, 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);

                                // HOW TO GET PRINTER NAME (\\ServerName\printername) WITH IS DIFFERENT FROM A PRINTER NAME IN "DEVICES AND PRINTERS" SYSTEM FOLDER
                            }
                        }
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(objEnumIDList);
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(objPrintersShellFolder);
                }
            }
            finally
            {
                Shell32.ILFree(pidlPrintersFolder);
            }
    }
    finally
    {
        Marshal.ReleaseComObject(iDesktopFolder);
    }

感谢您的帮助。

thanks for any help.

推荐答案

找到答案由我自己。

要枚举的IShellFolder打印机必须使用IShellFolder.ParseDisplayName方法,而不是EnumObjects,并从PrinterSettings.IntalledPrinters(如\服务器\ PrinterName的网络打印机)发送打印机名称以IShellFolder.ParseDisplayName参数pszDisplayName,的IShellFolder设备和打印机工作,这很好。

To enumerate printers in IShellFolder we must use IShellFolder.ParseDisplayName method, not EnumObjects, and send printer name from PrinterSettings.IntalledPrinters (such as "\ServerName\PrinterName" for network printers) to IShellFolder.ParseDisplayName param pszDisplayName, IShellFolder "Devices and printers" work with this well.

那么,在这之后,我们可以列举真正的打印机名称(\服务器\ PrinterName的),打印机显示名称(PrinterName的ServerName上,如设备和打印机中列出打印机)和打印机的图标。

So, after this we can enumerate real printer names ("\ServerName\PrinterName"), printer display names ("PrinterName on ServerName" as printers listed in "Devices and printers") and printer icons.

我会在这里发布全code为父亲寻找一些修改后。

I will post full code here for father search after some edits.

这篇关于我怎样才能从设备和打印机的IShellFolder打印机名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆