2010-04-15 75 views
2

如何確定打印機是否已連接?即使WinForms不可用/連接,WinForms也會打印到默認打印機

通常,此應用程序打印到默認打印機,但在某些情況下,打印機可能不可用。如果是這樣,我不希望作業發送到隊列中,而是打印到其他可用的打印機。

我瞭解PrinterSettings.InstalledPrinters屬性。如果打印機不可用,PrintDocument.PrinterSettings.IsValid是否返回false?

WPF是否提供這種功能?

我的問題是不是Printing problem in C# windows app - Always prints to default printer

回答

3

首先,IsValid的檢查PrinterName的財產的價值,看它是否是一個有效的值,如果沒有連接打印機。

其次,在WPF中很容易做到這一點;

var defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 
if (!defaultPrintQueue.IsNotAvailable) 
{ 
    //print stuff 
} 

檢查docs更多細節: 在的WinForms,它有點困難,但你可以使用WMI。參考System.Management.dll並添加以下using語句:

using System; 
using System.Drawing.Printing; 
using System.Windows.Forms; 
using System.Management; 

要獲得所有默認打印機:

注意下面的代碼很可能是依賴於操作系統在一定程度上。檢查MSDN文檔..

var printerSearcher = 
    new ManagementObjectSearcher(
     "SELECT * FROM Win32_Printer where Default = true" 
    ); 
    return printerSearcher.Get(); 

WMI documentation for the printer對象介紹了一些有用的結構,我們可以看一下; PrinterStatus和WorkOffline。我們可以利用這些寫一個實用工具類,以檢查打印機的可用性,同時檢查其WorkOffline狀態......

public static class PrinterUtility 
{ 
    public static bool IsOnline(this ManagementBaseObject printer) 
    { 
     var status = printer["PrinterStatus"]; 
     var workOffline = (bool)printer["WorkOffline"]; 
     if (workOffline) return false; 

     int statusAsInteger = Int32.Parse(status.ToString()); 
     switch (statusAsInteger) 
     { 
      case 3: //Idle 
      case 4: //Printing 
      case 5: //Warming up 
      case 6: //Stopped printing 
       return true; 
      default: 
       return false; 
     } 
    } 

    public static ManagementObjectCollection GetDefaultPrinters() 
    { 
     var printerSearcher = 
      new ManagementObjectSearcher(
      "SELECT * FROM Win32_Printer where Default = true" 
     ); 
     return printerSearcher.Get(); 
    } 
} 

現在你可以用標準的WinForms System.Drawing.Printing代碼結合本:

//in a function, far far away from any button click handler :P 
foreach(var printer in PrinterUtility.GetDefaultPrinters()) 
{ 
    if (printer.IsOnline()) 
    { 
    var pDoc = new PrintDocument(); //or get from PrintDialog 
    pDoc.PrinterSettings.PrinterName = printer["Name"].ToString(); 
    if (pDoc.PrinterSettings.IsValid) //just check WMI didn't tell fibs about the name 
    { 
     //do printy things  
    } 
    } 
} 

希望這有助於

+0

我會盡快嘗試。 – Valentein 2010-04-15 18:41:20

0

使用WMI和Win32_Printer類不同,我應該能夠檢查可用性屬性,查看打印機是否聯機。

這個問題和答案幫助:

how do i check if a printer is installed and ready using C#?

+0

我試過在我的Windows 7中,可用性屬性似乎返回null。儘管PrinterStatus工作得非常好。不幸的是,這可能取決於打印機。 – 2010-04-15 05:29:36

+0

該應用程序將專門在XP 64位上運行。 – Valentein 2010-04-15 18:37:15

0

你嘗試從觀點PrintDialog類點探索呢? PrintDialog.PrinterSettings.IsDefaultPrinter ...

+0

然後,您如何使用PrinterSettings類來檢查它是否已連接? – 2010-04-15 05:28:26

+0

要求是這樣的,我們不會使用PrintDialog。 – Valentein 2010-04-15 18:40:00

相關問題