文章出處

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

 

1.獲取系統中的所有打印機

  獲取系統中的所有打印機可以使用EnumPrinters()函數,該函數可以枚舉全部的本地、網絡打印機信息。其函數原型為:

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可以是以下標志量的組合:

  PRINTER_ENUM_LOCAL:枚舉本地打印機(包括Window95中的網絡打印機)

  PRINTER_ENUM_NAME:枚舉由參數Name指定的打印機,如果參數Name為NULL,則枚舉出所有可用的打印機

  PRINTER_ENUM_SHARE:枚舉出共享打印機(必須同其他標志量組合使用)

  PRINTER_ENUM_CONNECTIONS:枚舉網絡列表中的打印機(僅適用于NT)

  PRINTER_ENUM_NETWORK:枚舉通過網絡連接的打印機(參數Level必須為1,僅適用于NT)

  參數Name表示同本機連接的打印機。

  參數Level表示級別(取值為1、2、4、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");

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()