2012-03-19 52 views
3

通常,在舊版Windows(98或更舊版本)中,我可以使用Printer api中的MarkingTechnology來獲取當前類型的打印機。但它在Windows 2000或更高版本中不可用。你有沒有其他方法可以在Windows 2000或更高版本中檢測它?查詢打印機信息通過WMI查詢在C#如何檢測點陣打印機的類型?

示例代碼

var queryResult = string.Empty; 
var query = new WqlObjectQuery("Select * from Win32_Printer"); 
var searcher = new ManagementObjectSearcher(query); 

foreach (ManagementObject printer in searcher.Get()) 
{ 
    foreach (var p in printer.Properties) 
    { 
     queryResult += p.Name + ": " + printer[p.Name] + Environment.NewLine; 
    } 

    queryResult += "--------------------------------" + Environment.NewLine; 
} 

Win32_Printer class documentation

感謝,

+1

我認爲我們可以通過水平分辨率是我的測試針式打印機是120 DPI,而不是至少300 DPI的普通打印機檢測到它。 – 2012-03-19 06:38:21

+0

然而,它仍然有一些分辨率高於300DPI的打印機。 http://www.equanet.co.uk/catalogue/item/Y871451 – 2012-03-19 06:45:33

+0

是否有激光在那裏的分辨率爲360dpi?我的經驗是,激光使用300dpi或其倍數。問題是低範圍inkjets(可能是360dpi/b&W)和一些奇怪的球,如我的標籤打印機:http://www.brother-usa.com/PTouch/ModelDetail.aspx?ProductID=PT1500PC這是180dpi/b&w (但是可以通過檢查可用的紙張來區分)。 – 2012-03-27 04:29:08

回答

2

簡短的回答:沒有,似乎沒有一以貫之這樣做的方法。

+0

+1,因爲你說「一致」。 – TheBlastOne 2012-03-27 04:01:29

0

我盡我所能找出檢測點陣打印機的可能方法。我嘗試調用GetDeviceCaps函數(檢索指定設備的特定於設備的信息)以獲得TECHNOLOGY項應該返回爲如果選定的打印機是點陣,則字符流

var hdc = CreateDC("WINSPOOL", printerName, null, IntPtr.Zero); 
var technology = (DeviceCapTechnology)GetDeviceCaps(hdc, (int)DeviceCap.TECHNOLOGY); 

但是,它總是返回科技項目爲光柵顯示。我不知道爲什麼它總是像這樣回報價值。

[DllImport("gdi32.dll")] 
static extern int GetDeviceCaps(IntPtr hdc, int nIndex); 

[DllImport("gdi32.dll")] 
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData); 

GetDeviceCaps function

Example Project