⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printer.cpp

📁 此代码是控制打印机的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				}
				
				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 + -