2008-09-17 4 views

Répondre

92

La manière la plus simple que j'ai trouvée est de créer un nouvel objet PrinterSettings. Il commence par toutes les valeurs par défaut, donc vous pouvez vérifier sa propriété Nom pour obtenir le nom de l'imprimante par défaut.

PrinterSettings est dans System.Drawing.dll dans l'espace de noms System.Drawing.Printing.

PrinterSettings settings = new PrinterSettings(); 
Console.WriteLine(settings.PrinterName);

Sinon, vous pouvez peut-être utiliser la méthode PrinterSettings.InstalledPrinters statique pour obtenir une liste de tous les noms d'imprimante, puis définissez la PrinterName propriété et vérifiez la IsDefaultPrinter. Je n'ai pas essayé cela, mais la documentation semble suggérer que cela ne fonctionnera pas. Apparemment IsDefaultPrinter n'est vrai que lorsque PrinterName n'est pas explicitement défini.

+6

Peut-être il vaut la peine de mentionner que les chaînes renvoyées de InstalledPrinters peuvent avoir un boîtier différent de celui NomImprimante propriété. Par exemple ce test a échoué sur mon système: Dim ps en tant que nouveau PrinterSettings Dim foundDefault As Boolean = False Pour chaque imprimante en tant que chaîne dans PrinterSettings.InstalledPrinters Si printer = ps.PrinterName Then foundDefault = True Fin Si Suivant Assert.IsTrue (foundDefault) – miasbeck

+1

Voici la technique de bouclage qui fonctionne pour moi. : foreach (nom de la chaîne dans PrinterSettings.InstalledPrinters) { PrinterSettings ps = new PrinterSettings(); ps.PrinterName = nom; if (ps.IsDefaultPrinter) nom de retour; } return null; – BrokeMyLegBiking

+0

Notez que cette méthode ne fonctionne pas si vous exécutez votre application en tant que service Windows. Je n'ai pas compris pourquoi. Je cours en tant que service local. –

27

Une autre approche utilise WMI (vous aurez besoin d'ajouter une référence à l'assemblée System.Management):

public static string GetDefaultPrinterName() 
{ 
    var query = new ObjectQuery("SELECT * FROM Win32_Printer"); 
    var searcher = new ManagementObjectSearcher(query); 

    foreach (ManagementObject mo in searcher.Get()) 
    { 
     if (((bool?) mo["Default"]) ?? false) 
     { 
      return mo["Name"] as string; 
     } 
    } 

    return null; 
} 
+2

À l'aide de PrinterSettings(), PrinterName renvoie parfois «L'imprimante par défaut n'est pas définie» comme nom d'imprimante, même si l'imprimante par défaut a été définie. La solution WMI ci-dessus de Nathan Baulch a fonctionné pour moi dans une telle situation. – Peter

10

Si vous voulez juste le nom de l'imprimante aucun avantage du tout. Mais WMI est capable de renvoyer tout un tas d'autres propriétés de l'imprimante:

using System; 
using System.Management; 
namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ObjectQuery query = new ObjectQuery(
       "Select * From Win32_Printer " + 
       "Where Default = True"); 

      ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(query); 

      foreach (ManagementObject mo in searcher.Get()) 
      { 
       Console.WriteLine(mo["Name"] + "\n"); 

       foreach (PropertyData p in mo.Properties) 
       { 
        Console.WriteLine(p.Name); 
       } 
      } 
     } 
    } 
} 

et pas seulement les imprimantes. Si vous êtes intéressé par n'importe quel type de données liées à l'informatique, il y a de fortes chances que vous l'obteniez avec WMI. WQL (la version WMI de SQL) est également l'un de ses avantages.

1
  • 1er créer une instance de l'objet PrintDialog.
  • puis appelez l'objet de dialogue d'impression et laissez le PrinterName vide. cela entraînera les fenêtres objet pour renvoyer le nom de l'imprimante defualt
  • écrire cette chaîne et l'utiliser comme nom de l'imprimante lorsque vous appelez la procédure d'impression

code:

Try 

    Dim _printDialog As New System.Windows.Forms.PrintDialog 

    xPrinterName = _printDialog.PrinterSettings.PrinterName '= "set as Default printer" 

Catch ex As Exception 
    System.Windows.Forms.MessageBox.Show("could not printed Label.", "Print Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
End Try 
7

J'utilise toujours dans ce cas le System.Printing.LocalPrintServer, ce qui permet également d'obtenir si l'imprimante est locale, réseau ou fax.

string defaultPrinter; 
using(var printServer = new LocalPrintServer()) { 
    defaultPrinter = printServer.DefaultPrintQueue.FullName); 
} 

ou en utilisant une méthode statique GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName 
1

Essayez aussi cet exemple

PrinterSettings printerName = new PrinterSettings(); 

string defaultPrinter; 

defaultPrinter = printerName.PrinterName; 
+1

Le code le plus rapide pour moi. Merci –

Questions connexes