2011-01-13 5 views
5

は私がネットでマシン上にインストールされたプリンタのすべてのリストを取得する方法を知っている:インストール済みのプリンタに関連付けられたアイコンを.Netで取得できますか?

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

InstalledPrintersは、しかし、単に文字列のリストです。 Windowsエクスプローラの「デバイスとプリンタ」に通常表示される名前とアイコンイメージの両方を含むインストールされたプリンタオブジェクトを取得する方法はありますか?

+0

このソリューションは良いスタートのようです、あなたはP /呼び出しますと再生を開始することができます: ます。http: //stackoverflow.com/questions/1063874/winapi-retrieving-icons-of-current-user-printers –

答えて

2

アイコンは、通常、dllファイルまたはメインEXEのいずれかに埋め込まれています。System.Drawing.Icon静的メソッドを見てください。下のリンクはWinForms用です。抽出されたアイコンストリームからのImageSource。このタスクの

How to: Extract the Icon Associated with a File in Windows Forms

+0

しかし、* .dllでプリンタのアイコンをクエリしますか? 私は、dllのアイコンを与えるSystem.Printing.dllを照会しようとしました。プリンタではありません。 –

+0

検索するDLLはWindows \ System32ディレクトリのDDORes.dllです。 –

0

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, 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 printerDisplayNameInPrintersFolder = strDisplay.ToString(); 

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

            result.Add(printerDisplayNameInPrintersFolder, printerIcon); 
           } 
          } 
         } 
         finally 
         { 
          Marshal.ReleaseComObject(objEnumIDList); 
         } 
        } 
        finally 
        { 
         Marshal.ReleaseComObject(objPrintersShellFolder); 
        } 
       } 
       finally 
       { 
        Shell32.ILFree(pidlPrintersFolder); 
       } 
     } 
     finally 
     { 
      Marshal.ReleaseComObject(iDesktopFolder); 
     } 

     return result; 
    } 
} 

は、結果辞書にそのプリンタ名は、プリンタ名がプリンタシェルフォルダに示される注意、それらが使用するプリンタ名、異なっていてもよいですPrinterSettingsクラス(たとえば、プリンタのシェルフォルダ内のネットワークプリンタは "on"と表示され、 "on"はWindowsのローカライゼーションに依存し、マシンのネットワーク名ではありません)。私はまだstandart PrinterSettingsクラスでそれを使用するためにIShellFolderから "実際の"プリンタ名を取得する方法を知らない。

とにかく、このコードはプリンタのシステムアイコンを読み込むため、あなたの仕事に使うことができます。

UPD:このコードで使用Shell32はクラスのコードは、(答えには大きすぎる)ここで見つけることができます:http://pastebin.com/thJuWx45

+0

IShellFolderでプリンタを列挙するには、EnumObjectsではなくIShellFolder.ParseDisplayNameメソッドを使用し、PrinterSettings.IntalledPrinters(ネットワークプリンタの場合は "\ ServerName \ PrinterName"など)からIShellFolder.ParseDisplayName param pszDisplayName、IShellFolder "Devices and printers"この井戸で作業してください。 実際のプリンタ名(「\ ServerName \ PrinterName」)、プリンタの表示名(「PrinterName on ServerName」は「Devices and printers」にリストされているプリンタ)とプリンタアイコンを列挙できます。 –

関連する問題