📄 printer.cpp
字号:
}
if (s.GetLength() > nBufferLen)
{
nBufferLen = s.GetLength()+1;
}
else
{
strncpy(szPaperList, s, s.GetLength());
bOk = TRUE;
}
}
delete []pszPaperNames;
}
GlobalFree((HGLOBAL)ppi2);
}
//return nPaperSize;
return bOk;
}
//////////
BOOL CPrinter::GetDefaultPrinter(LPTSTR szPrinterName, int nPrintNameBufferLen)
{
*szPrinterName = 0;
CPrintDialog pd(FALSE);
if (pd.GetDefaults())
{
if (pd.m_pd.hDC)
DeleteDC(pd.m_pd.hDC);
if (pd.m_pd.hDevNames)
{
LPDEVNAMES pdn = (LPDEVNAMES)GlobalLock(pd.m_pd.hDevNames);
nPrintNameBufferLen--;
*(szPrinterName + nPrintNameBufferLen) = 0;
_tcsncpy(szPrinterName, (LPTSTR)pdn + pdn->wDeviceOffset, nPrintNameBufferLen); //打印机名称
GlobalUnlock(pd.m_pd.hDevNames);
GlobalFree(pd.m_pd.hDevNames);
}
}
return (*szPrinterName);
}
////////////////////////////////////////
BOOL CPrinter::GetPrinterList(LPTSTR szPrinterNameList, long & nPrintNameBufferLen)
{
PRINTER_INFO_2 *pPrinterInfo = NULL;
DWORD dFlags = 0;
DWORD cbNeeded;
DWORD cbReturned;
BOOL rt = FALSE;
LPBYTE buff = NULL;
CString s,temp;
if (IsWindowsNT())
{
dFlags = PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL;
}
else
{
dFlags = PRINTER_ENUM_LOCAL;
}
rt = EnumPrinters(dFlags, NULL, 2, NULL, NULL, &cbNeeded, &cbReturned);
if (!rt)
{
if (cbNeeded>0)
{
buff = new BYTE[cbNeeded];
rt = EnumPrinters(dFlags, NULL, 2, buff, cbNeeded, &cbNeeded, &cbReturned);
if(rt)
{
pPrinterInfo = (PRINTER_INFO_2 *)buff;
for(DWORD i=0;i<cbReturned;i++)
{
temp = pPrinterInfo[i].pPrinterName;
s = s+temp+"\t";
}
memset(szPrinterNameList,0,nPrintNameBufferLen);
if (s.GetLength() > nPrintNameBufferLen)
{
nPrintNameBufferLen = s.GetLength();
rt = FALSE;
}
else
{
strncpy(szPrinterNameList, s, s.GetLength());
rt = TRUE;
}
}
}
}
return rt;
}
////////////////////////////////////////////////////////////////////
BOOL CPrinter::GetPrinterStatus(LPTSTR szPrinterName, long & status)
{
BOOL bOk = FALSE;
PRINTER_INFO_2 *ppi2 = NULL;
ppi2 = GetInfo2(szPrinterName);
if(ppi2)
{
status = ppi2->Status;
GlobalFree((HGLOBAL)ppi2);
bOk = TRUE;
}
return bOk;
}
////////////////////////////////////////////////////////////////////
//获得打印机是否处于脱机状态
BOOL CPrinter::GetPrinterAttribute(LPTSTR szPrinterName, long & Attribute)
{
BOOL bOk = FALSE;
PRINTER_INFO_5 *ppi5 = NULL;
DWORD cbNeeded = 0;
HANDLE hPrinter = GetPrinterHandle(szPrinterName);
if (hPrinter)
{
Sleep(50);
GetPrinter(hPrinter, 5, 0,0, &cbNeeded);
if (cbNeeded)
{
ppi5 = (PRINTER_INFO_5*)GlobalAlloc(GPTR, cbNeeded);
if(ppi5)
{
if(GetPrinter(hPrinter, 5, (LPBYTE)ppi5, cbNeeded, &cbNeeded))
{
if(ppi5->Attributes & PRINTER_ATTRIBUTE_WORK_OFFLINE)
Attribute = 1;
else
Attribute = 0;
bOk = TRUE;
}
GlobalFree((HGLOBAL)ppi5);
ppi5 = NULL;
}
}
ClosePrinter(hPrinter);
}
return bOk;
}
BOOL CPrinter::SetPrinterDefault(LPTSTR szPrinterName)
{
BOOL rt = FALSE;
if (IsWindowsNT())
{
if(GetWindowsVer()>=5) //win2000/2003/xp
{
rt = SetDefaultPrinter(szPrinterName);
}
else //win nt 4 要写win.ini文件
{
LPTSTR pBuffer = NULL;
PRINTER_INFO_2 *ppi2 = GetInfo2(szPrinterName);
if(ppi2)
{
pBuffer = new CHAR[lstrlen(szPrinterName) + lstrlen(ppi2->pDriverName) + lstrlen(ppi2->pPortName) + 3];
lstrcpy(pBuffer, szPrinterName);
lstrcat(pBuffer, ",");
lstrcat(pBuffer, ppi2->pDriverName);
lstrcat(pBuffer, ",");
lstrcat(pBuffer, ppi2->pPortName);
//写到win.ini文件中
rt = WriteProfileString("windows", "device", pBuffer);
delete [] pBuffer;
GlobalFree((HGLOBAL)ppi2);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L, SMTO_NORMAL, 1000, NULL);
}
}
}
else //win98,win95使用SetPrinter函数,修改成员Attributes
{
PRINTER_INFO_2 *ppi2 = GetInfo2(szPrinterName);
if(ppi2)
{
ppi2->Attributes |= PRINTER_ATTRIBUTE_DEFAULT;
rt = SetInfo2(ppi2);
GlobalFree((HGLOBAL)ppi2);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
(LPARAM)(LPCTSTR)"windows", SMTO_NORMAL, 1000, NULL);
}
}
return rt;
}
//获得打印机的送纸器名称列表
BOOL CPrinter::GetBinNameList(LPTSTR szPrinterName, LPTSTR szBinNameList)
{
BOOL rt = FALSE;
LPTSTR pPortName = NULL;
LPTSTR pDriverName = NULL;
LPTSTR pBinNameList = NULL;
pPortName = new CHAR[64];
pDriverName = new CHAR[64];
long binCount = 0;
rt = GetPrinterPort(szPrinterName, pPortName, 64, pDriverName, 64);
if (rt)
{
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
pBinNameList = new CHAR[binCount * 24];
memset(pBinNameList,0, binCount * 24);
CHAR BinName[24];
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
CString s;
CString t;
for(int i=0;i<binCount;i++)
{
memset(BinName, 0, 24);
memcpy(BinName, pBinNameList+(i*24),24);
t = BinName;
s = s+t+"\t";
}
lstrcpy(szBinNameList, s);
rt = TRUE;
}
delete [] pBinNameList;
}
}
delete [] pPortName;
delete [] pDriverName;
return rt;
}
//由指定的送纸器的名称,获得送纸器的代码
BOOL CPrinter::GetBin(LPTSTR szPrinterName, LPTSTR szBinName, short & nBin)
{
BOOL rt = FALSE;
LPTSTR pPortName = NULL;
LPTSTR pDriverName = NULL;
LPTSTR pBinNameList = NULL; //送纸器的名称列表
WORD *pBinList = NULL; ////送纸器的代吗列表
BOOL bGetBinNameList = FALSE;
BOOL bGetBinList = FALSE;
pPortName = new CHAR[64];
pDriverName = new CHAR[64];
long binCount = 0;
rt = GetPrinterPort(szPrinterName, pPortName, 64, pDriverName, 64);
if (rt)
{
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
//获得送纸器的名称列表
pBinNameList = new CHAR[binCount * 24];
memset(pBinNameList,0, binCount * 24);
CHAR BinName[24];
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
bGetBinNameList = TRUE;
}
pBinList = new WORD[sizeof(WORD) * 24 * binCount];
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINS, (LPTSTR)pBinList, NULL);
if(binCount)
{
bGetBinList = TRUE;
}
if (bGetBinNameList && bGetBinList)
{
long k = -1;
for(long i=0;i<binCount;i++)
{
memset(BinName, 0, 24);
memcpy(BinName, pBinNameList + (i * 24), 24);
if(lstrcmp(szBinName, BinName)==0)
{
k = i;
break;
}
}
if(k>=0)
{
nBin = pBinList[k];
rt = TRUE;
}
else
{
nBin = -1;
}
}
delete [] pBinNameList;
delete [] pBinList;
}
}
delete [] pPortName;
delete [] pDriverName;
return rt;
}
//由指定的送纸器的代码,返回送纸器的名称
BOOL CPrinter::GetBinName(LPTSTR szPrinterName, LPTSTR szBinName, short nBin)
{
BOOL rt = FALSE;
LPTSTR pPortName = NULL;
LPTSTR pDriverName = NULL;
LPTSTR pBinNameList = NULL; //送纸器的名称列表
WORD *pBinList = NULL; ////送纸器的代吗列表
BOOL bGetBinNameList = FALSE;
BOOL bGetBinList = FALSE;
pPortName = new CHAR[64];
pDriverName = new CHAR[64];
long binCount = 0;
rt = GetPrinterPort(szPrinterName, pPortName, 64, pDriverName, 64);
if (rt)
{
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
//获得送纸器的名称列表
pBinNameList = new CHAR[binCount * 24];
memset(pBinNameList,0, binCount * 24);
//CHAR BinName[24];
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINNAMES, pBinNameList, NULL);
if(binCount)
{
bGetBinNameList = TRUE;
}
pBinList = new WORD[sizeof(WORD) * 24 * binCount];
binCount = DeviceCapabilities(szPrinterName, pPortName, DC_BINS, (LPTSTR)pBinList, NULL);
if(binCount)
{
bGetBinList = TRUE;
}
if (bGetBinNameList && bGetBinList)
{
long k = -1;
for(long i=0;i<binCount;i++)
{
if(pBinList[i]==nBin)
{
k = i;
break;
}
}
if(k>=0)
{
memcpy(szBinName, pBinNameList + (k * 24), 24);
rt = TRUE;
}
}
delete [] pBinNameList;
delete [] pBinList;
}
}
delete [] pPortName;
delete [] pDriverName;
return rt;
}
//获得打印机的作业列表
BOOL CPrinter::GetPrinterJobList(LPTSTR szPrinterName, LPTSTR szJobList)
{
//HANDLE hPrinter = NULL;
//hPrinter = GetPrinterHandle(szPrinterName);
//if (hPrinter)
//{
//
// ClosePrinter(hPrinter);
// return TRUE;
//}
//return FALSE;
CString s,t,status;
HANDLE hPrinter;
DWORD dwNeeded, dwReturned, i;
JOB_INFO_2 *pJobInfo;
//打开打印机
hPrinter = GetPrinterHandle(szPrinterName);
if(!hPrinter)
return FALSE;
//获得需要的内存数量
if(!EnumJobs(hPrinter, 0, 0xFFFFFFFF, 2, NULL, 0, &dwNeeded, &dwReturned))
{
if( GetLastError() != ERROR_INSUFFICIENT_BUFFER )
{
ClosePrinter( hPrinter );
return FALSE;
}
}
//分配内存
pJobInfo = (JOB_INFO_2*)GlobalAlloc(GPTR, dwNeeded);
if(!pJobInfo)
{
ClosePrinter( hPrinter );
return FALSE;
}
//获得JOB_INFO_2的数组
if( ! EnumJobs( hPrinter, 0, 0xFFFFFFFF, 2, (LPBYTE)pJobInfo, dwNeeded, &dwNeeded, &dwReturned ) )
{
ClosePrinter( hPrinter );
GlobalFree((HGLOBAL)pJobInfo);
return FALSE;
}
//如果程序能运行到这里,则已经获得打印作业的数组
ClosePrinter( hPrinter );
//格式化结果
for(i=0;i<dwReturned;i++)
{
t.Format("%d\t%s", pJobInfo[i].JobId, pJobInfo[i].pDocument);
//打印状态
status = "";
if(pJobInfo[i].Status & JOB_STATUS_PAUSED)
status = "已暂停";
if(pJobInfo[i].Status & JOB_STATUS_ERROR)
status = status + " - 错误";
if(pJobInfo[i].Status & JOB_STATUS_DELETING)
status = status + " - 正在删除";
if(pJobInfo[i].Status & JOB_STATUS_SPOOLING)
status = status + " - 正在缓冲";
if(pJobInfo[i].Status & JOB_STATUS_PRINTING)
status = status + " - 正在打印";
if(pJobInfo[i].Status & JOB_STATUS_OFFLINE)
status = status + " - 离线";
if(pJobInfo[i].Status & JOB_STATUS_PAPEROUT)
status = status + " - 缺纸";
if(pJobInfo[i].Status & JOB_STATUS_PRINTED)
status = status + " - 打印完成";
if(pJobInfo[i].Status & JOB_STATUS_DELETED)
status = status + " - 已删除";
if(status.Left(3)==" - ")
status = status.Right(status.GetLength() - 3);
t = t + "\t" + status;
s = s + t + "\t";
//所有者
t = pJobInfo[i].pUserName;
s = s + t + "\t";
//打印作业的大小,以字节为单位
t.Format("%d", pJobInfo[i].Size);
s = s + t + "\t";
//页数
t.Format("%d", pJobInfo[i].TotalPages);
s = s + t + "\t";
//以打印页数
t.Format("%d", pJobInfo[i].PagesPrinted);
s = s + t + "\t";
//提交时间
SYSTEMTIME localSystemTime;
FILETIME fileTime, localFileTime;
::SystemTimeToFileTime(&pJobInfo[i].Submitted, &fileTime); //将SYSTEMTIME转换成FILETIME
::FileTimeToLocalFileTime(&fileTime, &localFileTime); //将 FILETIME转换成Local FILETIME
::FileTimeToSystemTime(&localFileTime, &localSystemTime); //将Local FILETIME 转换成SYSTEMTIME
t.Format("%d.%02d.%02d %02d:%02d:%02d", localSystemTime.wYear, localSystemTime.wMonth, localSystemTime.wDay, localSystemTime.wHour, localSystemTime.wMinute, localSystemTime.wSecond);
s = s + t + "\t";
}
// Clean up
GlobalFree((HGLOBAL)pJobInfo);
strcpy(szJobList, s);
/////////////////////JOB_STATUS_DELETING
AfxMessageBox(s);
return TRUE;
}
/////////////
//控制打印机的作业
BOOL CPrinter::SetPrinterJob(LPTSTR szPrinterName, int nJobId, int nCommand)
{
HANDLE hPrinter = NULL;
BOOL rt = FALSE;
//打开打印机 JOB_CONTROL_CANCEL
/*
#define JOB_CONTROL_PAUSE 1
#define JOB_CONTROL_RESUME 2
#define JOB_CONTROL_CANCEL 3
#define JOB_CONTROL_RESTART 4
#define JOB_CONTROL_DELETE 5
*/
hPrinter = GetPrinterHandle(szPrinterName);
if(!hPrinter)
return FALSE;
rt = SetJob(hPrinter, nJobId, 0, NULL, nCommand);
return rt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -