枚举计算机的所有打印机

#include<winspool.h>PRINTER_INFO_5*prninfo=NULL;voidCMFCApplication1Dlg::OnBnClickedButton8(){DWORDdwNeeded=0,dwReturned=0;EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,NULL,0,&dwNeeded,&dwReturned);prninfo=(PRINTER_INFO_5*)GlobalAlloc(GPTR,dwNeeded);if(EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,(LPBYTE)prninfo,dwNeeded,&dwNeeded,&dwReturned)){for(DWORDi=0;i<dwReturned;i++,prninfo++){TRACE(_T("x=%s\n"),prninfo->pPrinterName);TRACE(_T("x=%s\n"),prninfo->pPortName);}}}

2.设置默认打印机

TCHARszPrinterName[1024]={0};GetDlgItemText(IDC_EDIT1,szPrinterName,1024);BOOLret=FALSE;ret=SetDefaultPrinter(szPrinterName);if(ret==FALSE)AfxMessageBox(_T("设置默认打印机失败"));elseAfxMessageBox(_T("设置默认打印机成功"));

3.启动打印机服务

SHELLEXECUTEINFOShExecInfo={0};ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd=NULL;ShExecInfo.lpVerb=NULL;ShExecInfo.lpFile=_T("cmd");ShExecInfo.lpParameters=_T("/Cnetstartspooler");ShExecInfo.lpDirectory=NULL;ShExecInfo.nShow=SW_HIDE;ShExecInfo.hInstApp=NULL;ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

4.获取指定打印机的所有纸张

TCHARszPaperName[30000]={0};TCHARstr[650]={0};voidCMFCApplication1Dlg::Printerdo1(){BYTE*pBuffer=NULL;DWORDdwSize=0;DWORDdwNum=0;//获得缓冲区大小::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,pBuffer,dwSize,&dwSize,&dwNum);pBuffer=newBYTE[dwSize];//枚举打印机::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,pBuffer,dwSize,&dwSize,&dwNum);if(dwNum!=0){//获得打印机信息PRINTER_INFO_5*pPrinterInfo=(PRINTER_INFO_5*)pBuffer;LPHANDLEphandle;HANDLEhandle;handle=malloc(sizeof(HANDLE));phandle=&handle;PRINTER_DEFAULTS*printer_defaults;printer_defaults=(PRINTER_DEFAULTS*)malloc(sizeof(PRINTER_DEFAULTS));LPWSTRstr_printername,str_portname,papername2;//添加打印机名及端口str_printername=pPrinterInfo->pPrinterName;str_portname=pPrinterInfo->pPortName;intnNeeded=0;nNeeded=DeviceCapabilities(str_printername,str_portname,DC_PAPERNAMES,NULL,NULL);DeviceCapabilities(str_printername,str_portname,DC_PAPERNAMES,szPaperName,NULL);for(inti=0,j=0;i<nNeeded&&szPaperName[j]!=0;){wmemcpy_s(str,64,(LPCWSTR)(&szPaperName)+j,64);m_ListPrinter.AddString(str);TRACE(_T("%s\n"),str);j+=64;}}}

5.获取所有纸张的尺寸

CPointpt[107];DeviceCapabilities(str_printername,str_printername,DC_PAPERSIZE,(LPWSTR)&pt,NULL);

6.获取默认打印机的默认纸型和大小

voidCMFCApplication1Dlg::OnBnClickedButton13(){//TODO:在此添加控件通知处理程序代码PRINTDLGFAR*pPrintDlg=newPRINTDLG;//获取当前打印机的设置if(AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg)){//获取打印机的两个设置信息结构DEVNAMESFAR*lpDevNames=(DEVNAMESFAR*)::GlobalLock(pPrintDlg->hDevNames);DEVMODEFAR*lpDevMode=(DEVMODEFAR*)::GlobalLock(pPrintDlg->hDevMode);//获取相关信息:驱动服务名,打印机名,端口号CStringszDriver((LPTSTR)lpDevNames+lpDevNames->wDriverOffset);CStringszDevice((LPTSTR)lpDevNames+lpDevNames->wDeviceOffset);CStringszOutput((LPTSTR)lpDevNames+lpDevNames->wOutputOffset);HANDLEhPrinter;::OpenPrinter((LPWSTR)(LPCWSTR)szDevice,&hPrinter,NULL);::DocumentProperties(NULL,hPrinter,(LPWSTR)(LPCWSTR)szDevice,lpDevMode,lpDevMode,DM_IN_BUFFER|DM_OUT_BUFFER);//结构解锁::GlobalUnlock(pPrintDlg->hDevNames);::GlobalUnlock(pPrintDlg->hDevMode);}deletepPrintDlg;}