【VC++技術雜談002】打印技術之獲取及設置系統默認打印機

  本文主要介紹如何獲取以及設置系統的默認打印機。網絡

 

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");
相關文章
相關標籤/搜索