2008-09-17 43 views

回答

92

我發現的最簡單的方法是創建一個新的PrinterSettings對象。它以所有默認值開始,因此您可以檢查其名稱屬性以獲取默認打印機的名稱。

PrinterSettings在命名空間System.Drawing.Printing中的System.Drawing.dll中。

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

或者,也許你可以使用靜態PrinterSettings.InstalledPrinters方法來獲取所有打印機的名稱列表,然後設置PrinterName的財產和檢查IsDefaultPrinter。我沒有嘗試過,但文檔似乎表明它不起作用。顯然IsDefaultPrinter只有當PrinterName沒有明確設置時才爲true。

+6

也許是值得一提的是從InstalledPrinters返回的串可以具有不同的殼體比PrinterName的屬性。例如,此測試在我的系統上失敗: Dim ps As New PrinterSettings Dim foundDefault As Boolean = False For Each Printer As String In PrinterSettings.InstalledPrinters If printer = ps。PrinterName Then foundDefault = True End If Next Assert.IsTrue(foundDefault) – miasbeck 2011-05-09 10:28:36

+1

這裏是循環技術,它適用於我。 :foreach(PrinterSettings.InstalledPrinters中的字符串名稱) { PrinterSettings ps = new PrinterSettings(); ps.PrinterName = name; 012(ps.IsDefaultPrinter) return name; } return null; – BrokeMyLegBiking 2013-03-18 21:08:31

+0

請注意,如果您將應用程序作爲Windows服務運行,則此方法不起作用。我還沒有弄清楚爲什麼。我作爲本地服務運行。 – 2017-04-14 13:26:42

27

另一種方法是使用WMI(你需要添加一個引用到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; 
} 
10

如果你只是想打印機名稱毫無優勢可言。但WMI能夠返回一大堆其他打印機屬性:

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); 
       } 
      } 
     } 
    } 
} 

而不僅僅是打印機。如果您對任何類型的計算機相關數據感興趣,可以通過WMI獲得。 WQL(WMI版本的SQL)也是它的優勢之一。

1
  • 1st創建一個PrintDialog對象的實例。
  • 然後調用打印對話框對象並將PrinterName留爲空白。這將導致Windows對象這個返回defualt打印機名稱
  • 寫一個字符串,當你調用打印過程

代碼中使用它作爲打印機名稱:

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

我用在這種情況下始終是System.Printing.LocalPrintServer,它也可以獲取打印機是本地,網絡還是傳真。

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

或使用靜態方法GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName 
1

嘗試也在本示例

PrinterSettings printerName = new PrinterSettings(); 

string defaultPrinter; 

defaultPrinter = printerName.PrinterName; 
相關問題