c# 获取打印机 打印任务 文件名 、状态

lanyubaic 2013-08-05 05:11:03





有什么办法判断 某个打印任务是否完成


...全文
1307 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
花落还会开 2014-11-17
  • 打赏
  • 举报
回复
/// <summary> /// 已解析过的打印任务列表 /// </summary> public static List<UInt32> AnalyzedJobs = new List<uint>();//20141112 /// <summary> /// 获取指定打印任务的信息 /// </summary> /// <param name="jobid">打印任务的ID</param> /// <param name="level">打印信息的等级(1 or 2)</param> public static PRINTED_ITEM_STRU AnalyzePrintJobInfo(string printername, IntPtr hprinter, UInt32 jobid, WinSpool.JOBSTATUS jobstatus, UInt32 level) { if (hprinter == IntPtr.Zero) throw new Exception("No30:打印句柄没有初始化!"); PRINTED_ITEM_STRU cstru = new PRINTED_ITEM_STRU(); if (AnalyzedJobs.Contains(jobid))//已经解析过则不再解析//20141112 { return cstru; } //防止对同一个打印任务进行重复的解析 if (jobstatus != WinSpool.JOBSTATUS.JOB_STATUS_PRINTING && jobstatus != 0) { //数据不需要分析 return cstru; } try { //20141112 if (AnalyzedJobs.Count > 100) AnalyzedJobs.RemoveRange(0, 10); AnalyzedJobs.Add(jobid); //20141112 end UInt32 lNeeded = 0; UInt32 lRetrieve = 0; //获取任务信息的字节数 bool ret = WinSpool.GetJob(hprinter, jobid, level, IntPtr.Zero, 0, out lNeeded); //初始化对应的内存空间 lRetrieve = lNeeded; IntPtr pData = Marshal.AllocHGlobal((int)lRetrieve); //获取任务信息 ret = WinSpool.GetJob(hprinter, jobid, level, pData, lRetrieve, out lNeeded); if (ret == true)//如果获取成功,则进行分析 { //根据level使用对应的结构体 int pTemp = pData.ToInt32();//start pointer WinSpool.JOB_INFO_2 info2 = new WinSpool.JOB_INFO_2(); info2 = (WinSpool.JOB_INFO_2)Marshal.PtrToStructure (new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_2)); int intRet = System.Convert.ToInt32(info2.Status); //Marshal.FreeHGlobal(new IntPtr(pTemp)); //WinSpool.ClosePrinter(hprinter); switch (level) { case 1: WinSpool.JOB_INFO_1 jobinfo = new WinSpool.JOB_INFO_1(); jobinfo = (WinSpool.JOB_INFO_1)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_1)); cstru.file_name = jobinfo.pDocument; cstru.page_num = (int)jobinfo.TotalPages; break; case 2: WinSpool.JOB_INFO_2 jobinfo2 = new WinSpool.JOB_INFO_2(); jobinfo2 = (WinSpool.JOB_INFO_2)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_2)); WinSpool.DEVMODE devm = new WinSpool.DEVMODE(); devm = (WinSpool.DEVMODE)Marshal.PtrToStructure(jobinfo2.pDevMode, typeof(WinSpool.DEVMODE)); cstru.copy_num = devm.dmCopies; cstru.color = devm.dmColor; cstru.duplex = devm.dmDuplex; cstru.paper_type = devm.dmPaperSize.ToString(); cstru.file_name = jobinfo2.pDocument; cstru.page_num = jobinfo2.TotalPages; cstru.time = jobinfo2.StartTime.ToString(); break; default: WinSpool.JOB_INFO_1 jobinfod = new WinSpool.JOB_INFO_1(); jobinfod = (WinSpool.JOB_INFO_1)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_1)); cstru.file_name = jobinfod.pDocument; cstru.page_num = (int)jobinfod.TotalPages; break; } } cstru.printer_name = printername; ////对结构体进行赋值 //PrintDocument pdoc = new PrintDocument(); //pdoc.PrinterSettings.PrinterName = printername; //cstru.copy_num = pdoc.PrinterSettings.Copies; //cstru.time = string.Empty; //cstru.color = pdoc.PrinterSettings.DefaultPageSettings.Color == false ? 0 : 1; //cstru.duplex = pdoc.PrinterSettings.Duplex == Duplex.Simplex ? 0 : 1; //cstru.paper_type = pdoc.PrinterSettings.DefaultPageSettings.PaperSize.PaperName; //释放内存空间 Marshal.FreeHGlobal(pData); } catch (Exception ex) { Console.WriteLine(ex.Message); } return cstru; }
花落还会开 2014-11-17
  • 打赏
  • 举报
回复
/// <summary> /// 已解析过的打印任务列表 /// </summary> public static List<UInt32> AnalyzedJobs = new List<uint>();//20141112 /// <summary> /// 获取指定打印任务的信息 /// </summary> /// <param name="jobid">打印任务的ID</param> /// <param name="level">打印信息的等级(1 or 2)</param> public static PRINTED_ITEM_STRU AnalyzePrintJobInfo(string printername, IntPtr hprinter, UInt32 jobid, WinSpool.JOBSTATUS jobstatus, UInt32 level) { if (hprinter == IntPtr.Zero) throw new Exception("No30:打印句柄没有初始化!"); PRINTED_ITEM_STRU cstru = new PRINTED_ITEM_STRU(); if (AnalyzedJobs.Contains(jobid))//已经解析过则不再解析//20141112 { return cstru; } //防止对同一个打印任务进行重复的解析 if (jobstatus != WinSpool.JOBSTATUS.JOB_STATUS_PRINTING && jobstatus != 0) { //数据不需要分析 return cstru; } try { //20141112 if (AnalyzedJobs.Count > 100) AnalyzedJobs.RemoveRange(0, 10); AnalyzedJobs.Add(jobid); //20141112 end UInt32 lNeeded = 0; UInt32 lRetrieve = 0; //获取任务信息的字节数 bool ret = WinSpool.GetJob(hprinter, jobid, level, IntPtr.Zero, 0, out lNeeded); //初始化对应的内存空间 lRetrieve = lNeeded; IntPtr pData = Marshal.AllocHGlobal((int)lRetrieve); //获取任务信息 ret = WinSpool.GetJob(hprinter, jobid, level, pData, lRetrieve, out lNeeded); if (ret == true)//如果获取成功,则进行分析 { //根据level使用对应的结构体 int pTemp = pData.ToInt32();//start pointer switch (level) { case 1: WinSpool.JOB_INFO_1 jobinfo = new WinSpool.JOB_INFO_1(); jobinfo = (WinSpool.JOB_INFO_1)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_1)); cstru.file_name = jobinfo.pDocument; cstru.page_num = (int)jobinfo.TotalPages; break; case 2: WinSpool.JOB_INFO_2 jobinfo2 = new WinSpool.JOB_INFO_2(); jobinfo2 = (WinSpool.JOB_INFO_2)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_2)); cstru.file_name = jobinfo2.pDocument; cstru.page_num = jobinfo2.TotalPages; cstru.time = jobinfo2.StartTime.ToString(); break; default: WinSpool.JOB_INFO_1 jobinfod = new WinSpool.JOB_INFO_1(); jobinfod = (WinSpool.JOB_INFO_1)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(WinSpool.JOB_INFO_1)); cstru.file_name = jobinfod.pDocument; cstru.page_num = (int)jobinfod.TotalPages; break; } } //对结构体进行赋值 PrintDocument pdoc = new PrintDocument(); pdoc.PrinterSettings.PrinterName = printername; cstru.printer_name = printername; cstru.copy_num = pdoc.PrinterSettings.Copies; cstru.time = string.Empty; cstru.color = pdoc.PrinterSettings.DefaultPageSettings.Color == false ? 0 : 1; cstru.duplex = pdoc.PrinterSettings.Duplex == Duplex.Simplex ? 0 : 1; cstru.paper_type = pdoc.PrinterSettings.DefaultPageSettings.PaperSize.PaperName; //释放内存空间 Marshal.FreeHGlobal(pData); } catch (Exception ex) { Console.WriteLine(ex.Message); } return cstru; }
  • 打赏
  • 举报
回复
帮顶。。 我也需要
lanyubaic 2013-08-06
  • 打赏
  • 举报
回复
pint 类吗?不好意思,我是初学者, .net 类库,是在 msdn 里面找吗!
lanyubaic 2013-08-06
  • 打赏
  • 举报
回复
printStateText 是什么意思,我换成 MessageBox.Show("打印机出错"); 结果 这些条件判断都不在里面。
lanyubaic 2013-08-06
  • 打赏
  • 举报
回复
PrintQueue 是引用system.printing.dll
lanyubaic 2013-08-06
  • 打赏
  • 举报
回复
PrintQueue 是引用 哪个!
  • 打赏
  • 举报
回复
获取状态: par:打印机名称
  private PrintQueue GetPrintQueue(string PrinterName)
        {
            LocalPrintServer pr = new LocalPrintServer();
            pr.Refresh();
            EnumeratedPrintQueueTypes[] enumerationFlags = {EnumeratedPrintQueueTypes.Local,
                                                            EnumeratedPrintQueueTypes.Connections,
                                                           };
            foreach (PrintQueue pq in pr.GetPrintQueues(enumerationFlags))
            {
                if (pq.Name == PrinterName)
                {
                    return pq;
                }
            }
            return null;
        }
判断状态:
 if (printQueue.IsBusy)
                    printStateText = "打印机正忙";
                else if (printQueue.IsDoorOpened)
                    printStateText = "打印机门被打开";
                else if (printQueue.IsInError)
                    printStateText = "打印机出错";
                else if (printQueue.IsInitializing)
                    printStateText = "打印机正在初始化";
                else if (printQueue.IsIOActive)
                    printStateText = "打印机正在与打印服务器交换数据";
                else if (printQueue.IsManualFeedRequired)
                    printStateText = "打印机出错";
                else if (printQueue.IsNotAvailable)
                    printStateText = "打印机状态信息不可用";
                else if (printQueue.IsTonerLow)
                    printStateText = "打印机墨粉用完";
                else if (printQueue.IsOffline)
                    printStateText = "打印机脱机";
                else if (printQueue.IsOutOfMemory)
                    printStateText = "打印机无可用内存";
                else if (printQueue.IsOutputBinFull)
                    printStateText = "打印机输出纸盒已满";
                else if (printQueue.IsPaperJammed)
                    printStateText = "打印机卡纸";
                else if (printQueue.IsOutOfPaper)
                    printStateText = "打印机中没有或已用完当前打印作业所需的纸张类型";
                else if (printQueue.QueueStatus == PrintQueueStatus.PaperProblem)
                    printStateText = "打印机中的纸张导致未指定的错误情况";
                else if (printQueue.IsPaused)
                    printStateText = "打印队列已暂停";
                else if (printQueue.IsPendingDeletion)
                    printStateText = "打印队列正在删除打印作业";
                else if (printQueue.IsPrinting)
                    printStateText = "设备正在打印";
                else if (printQueue.IsProcessing)
                    printStateText = "设备正在执行某种工作,如果此设备是集打印机、传真机和扫描仪于一体的多功能设备,则不需要打印.";
                else if (printQueue.IsServerUnknown)
                    printStateText = "打印机处于错误状态";
                //else if (printQueue.IsWarmingUp)
                //     printStateText = "打印机正在预热";
  • 打赏
  • 举报
回复
使用.net类库里面的print即可

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧