本文主要介紹如何獲取以及設置系統的默認打印機。網絡
1.獲取系統中的全部打印機函數
獲取系統中的全部打印機可使用EnumPrinters()函數,該函數能夠枚舉所有的本地、網絡打印機信息。其函數原型爲:spa
1 BOOL WINAPI EnumPrinters( 2 DWORD Flags, 3 LPSTR Name, 4 DWORD Level, 5 LPBYTE pPrinterEnum, 6 DWORD cbBuf, 7 LPDWORD pcbNeeded, 8 LPDWORD pcReturned 9 );
其中,參數Flags能夠是如下標誌量的組合:3d
PRINTER_ENUM_LOCAL:枚舉本地打印機(包括Window95中的網絡打印機)code
PRINTER_ENUM_NAME:枚舉由參數Name指定的打印機,若是參數Name爲NULL,則枚舉出全部可用的打印機對象
PRINTER_ENUM_SHARE:枚舉出共享打印機(必須同其餘標誌量組合使用)blog
PRINTER_ENUM_CONNECTIONS:枚舉網絡列表中的打印機(僅適用於NT)內存
PRINTER_ENUM_NETWORK:枚舉經過網絡鏈接的打印機(參數Level必須爲1,僅適用於NT)原型
參數Name表示同本機鏈接的打印機。博客
參數Level表示級別(取值爲一、二、四、5,4僅適用於NT,5僅適用於Win95和NT4.0)。
參數pPrinterEnum表示PRINTER_ENUM_x結構的緩衝區,其中x表明級別。
參數cbBuf表示PRINTER_ENUM_x結構的緩衝區字節大小。
參數pcbNeeded表示實際讀入的字節數量。
參數pcReturned表示載入緩衝區的結構數量。
以下的代碼示例瞭如何經過使用EnumPrinters()函數來獲取系統中的全部打印機:
1 /* 2 * 函數功能 : 獲取系統中全部的打印機名稱 3 * 備 注 : 4 * 做 者 : 博客園 依舊淡然 5 */ 6 CString CPrintDemoDlg::GetAllPrinterName() 7 { 8 DWORD dwSize; 9 DWORD dwPrinters; 10 CString strPrintersName = _T(""); 11 12 //第一次調用獲得結構體的大小 13 ::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, 14 NULL, 5, NULL, 0, &dwSize, &dwPrinters); 15 16 //第二次調用獲得打印機列表 17 BYTE *pBuffer = new BYTE[dwSize]; 18 ::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, 19 NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters); 20 21 //獲得全部的打印機名稱 22 if(dwPrinters != 0) 23 { 24 PRINTER_INFO_5 *pPrinterInfo = (PRINTER_INFO_5 *)pBuffer; 25 for(int i=0; i<dwPrinters; i++) 26 { 27 strPrintersName += pPrinterInfo->pPrinterName; //獲得打印機名稱 28 strPrintersName += _T("\r\n"); 29 pPrinterInfo++; 30 } 31 } 32 delete []pBuffer; 33 34 return strPrintersName; 35 }
其中,EnumPrinters()函數被調用了兩次,第一次調用是爲了獲得結構體的大小dwSize,以便申請適當的內存空間大小,第二次調用是爲了獲得打印機列表。結構體PRINTER_INFO_5中的pPrinterName字段存儲了打印機的名稱。返回值strPrintersName保存了查找到得系統中全部打印機名稱,如圖1所示。
圖1 當前系統中的全部打印機
這與控制面板->打印機與傳真中列出的當前系統中全部打印機是一致的,如圖2所示。
圖2 當前系統中的全部打印機
須要注意的一點是,使用EnumPrinters()函數時,須要包含頭文件winspool.h和庫文件Winspool.lib,具體方法以下:
1 #include <winspool.h> 2 #pragma comment(lib, "Winspool.lib")
2.獲取系統的默認打印機
由圖2能夠看出,在系統默認打印機(Adobe PDF)的圖標上會有一個「√」符號,以示與其餘非默認打印機的區別。那麼咱們如何經過程序來獲取系統的默認打印機呢?
CPrintDialog類封裝了Windows通用打印對話框,其成員函數GetDefaults()可以在打印對話框不顯示的狀況下獲取當前打印機的缺省狀態,而不須要用戶的交互做用。
此外,該類還提供了一系列函數,用於獲取和設置打印參數,如:
GetDeviceName(); //獲取打印機名稱
GetCopies(); //獲取打印份數
GetFromPage(); //獲取打印起始頁碼
GetToPage(); //獲取打印結束頁碼
等等,咱們要獲取系統的默認打印機,可使用GetDeviceName()函數來實現。以下的代碼示例瞭如何獲取打印機名稱、打印機驅動名和打印機端口:
1 /* 2 * 函數功能 : 獲取系統的默認打印機 3 * 備 注 : 4 * 做 者 : 博客園 依舊淡然 5 */ 6 CString CPrintDemoDlg::GetSystemDefaultPrinter() 7 { 8 CString strPrinterInfo = _T(""); 9 10 CPrintDialog printDialog(FALSE); //構造打印設置對話框對象 11 printDialog.GetDefaults(); //獲取默認打印設備的設備環境 12 CString strDeviceName = printDialog.GetDeviceName(); //獲取當前打印機的名稱 13 CString strDriverName = printDialog.GetDriverName(); //獲取當前打印機的驅動名 14 CString strPortName = printDialog.GetPortName(); //獲取當前打印機的端口 15 strPrinterInfo += _T("打印機名稱: ") + strDeviceName + _T("\r\n"); 16 strPrinterInfo += _T("打印機驅動: ") + strDriverName + _T("\r\n"); 17 strPrinterInfo += _T("打印機端口: ") + strPortName + _T("\r\n"); 18 19 return strPrinterInfo; 20 }
其中,返回值strPrinterInfo保存了系統默認打印機的名稱、驅動名和端口。如圖3所示。
圖3 系統默認打印機
3.設置系統默認打印機
若是咱們想要設置系統的默認打印機,又該怎麼作呢?其實,使用SetDefaultPrinter()函數就能夠了。可是,在使用這個函數以前,須要確認在winspool.h文件中是否對該函數進行了定義。若是沒有,咱們就須要在winspool.h文件中添加如下代碼段:
1 BOOL 2 WINAPI SetDefaultPrinterA( 3 LPCTSTR pszPrinter 4 ); 5 BOOL 6 WINAPI SetDefaultPrinterW( 7 LPCTSTR pszPrinter 8 ); 9 #ifdef UNICODE 10 #define SetDefaultPrinter SetDefaultPrinterW 11 #else 12 #define SetDefaultPrinter SetDefaultPrinterA 13 #endif // !UNICODE
至此,咱們就能夠經過調用SetDefaultPrinter()函數,設置系統的默認打印機了。好比,咱們想要將虛擬打印機TinyPDF設置爲系統默認打印機,能夠經過如下代碼實現:
::SetDefaultPrinter("TinyPDF");