社区
分析与设计
帖子详情
c#怎样取出打印机的任务队列
yueyangyxj
2007-04-05 11:42:54
请问在C#里怎样取出打印机的打印对列啊?我用ENUMJOBS,OPENPRINTER总是无法取出,那么大侠碰到这样的问题,请给出源代码?
...全文
2541
5
打赏
收藏
c#怎样取出打印机的任务队列
请问在C#里怎样取出打印机的打印对列啊?我用ENUMJOBS,OPENPRINTER总是无法取出,那么大侠碰到这样的问题,请给出源代码?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
playtang
2010-04-27
打赏
举报
回复
mark
cannycsy
2007-04-06
打赏
举报
回复
帮下这个
http://community.csdn.net/Expert/topic/5445/5445916.xml?temp=.648617
CathySun118
2007-04-06
打赏
举报
回复
请参考:
二、与打印状态相关的API:
Api函数名 函数说明 W3.x W9x NT
EnumJobs 获取打印作业信息 否 是 是
OpenPrinter 获取指定打印机的句柄 否 是 是
在 Windows NT 版本以及 Windows 9x 中,增加了一批全新的、专门用来处理打印机及打印机队列状态的 API 函数。在这里,将通过 API 函数 OpenPrinter 与 EnumJobs,来确定打印机打印作业状态所需的信息。
OpenPrinter,用来获取给定打印机的句柄,通过该句柄可以实现对相应打印机的操作。
函数 EnumJobs,用来列出所指定打印机上正在打印的作业信息,这里给定打印机的引用就是通过使用上述OpenPrinter函数反馈回来的打印机句柄。
EnumJobs函数介绍:
EnumJobs (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Long, ByVal cbBuf As Long, pcbNeeded As Long, pcReturned As Long)
API函数EnumJobs用于列举给定打印机当前所有正在打印的任务状态信息,该函数可以列举给定打印机简要的或者详细的(Level决定)队列任务状态信息。在引用该函数时,通常先把cbBuf变量设置为0,以获得打印机队列任务的字节数,该字节数存储在pcbNeeded里以决定pJob变量大小,然后再次引用该函数,获得打印机队列任务的详细信息。
参数:
hPrinter
打印机句柄。
FirstJob
统计打印机队列任务数的起始点,0表示从第一个任务开始统计列举所有的打印任务。
NoJobs
需要列举的最大打印任务数。一般设为127。
Level
标示存储在pJob里的信息格式。如果该值为1,数据以JOB_INFO_1的格式存储;如果该值为2,数据以JOB_INFO_2的格式存储。
pJob
数组变量,保存打印任务的所有信息;cbBuf设为0时,该值也为0。Level变量的值决定pJob的数据格式(JOB_INFO_1 OR JOB_INFO_2)
cbBuf
该值通常为0。
pcbNeeded
存储打印机里打印任务的字节数。
pcReturned
用来存放打印任务数量的变量。
通过上表可以看出,这两个API函数只用使用在Windows 9x 以及 Windows NT环境中。
三、开发工具:
C++ Builder作为快速开发Windows平台下应用程序的工具,已经为越来越多的开发者采用。但是,如果要开发出专业的Windows应用软件,还需要使用大量的Windows API函数,以下是笔者应用C++ Builder以及Windows API函数来实现对打印机状态的时时监控。
选择C++ Builder的理由:
一:由于Windows API 都是用C或C++编写的,C++ Builder更易于底层应用。
二:C++ Builder对于Windows API的引用更加简单,这一点是Visual Basic所欠缺的。
四、程序实例:
1、启动C++ Builder程序,新创建一个工程;
2、进入工程,在当前窗体分别添加一个CheckListBox控件、一个Timer控件;
3、在CheckListBox控件的Item属性添加打印机名称列表(假设在网络中HostPrinter主机上有三台打印机Printer1、Printer2、Printer3),则Item项目里内容格式为:\\HostPrinter\Printer1、\\HostPrinter\\Printer2、\\HostPrinter\\Printer3 ;
4、Timer的Interval属性设置为60000(一分钟),在Timer的OnTimer事件加入如下代码:
{
HANDLE hPrinter; //打印机句柄
JOB_INFO_2 jobs[30]; //保留打印作业详细信息
DWORD size=sizeof(jobs);
JOB_INFO_2 *jobs1=NULL; //动态数组用于对大于size的任务进行操作
DWORD pcbNeeded=0; //所有打印字节数
int actNeed=0;
DWORD pcReturned=0; //打印任务数
char buf[19]; //指向打印机或机器名
int ret1; //获得打印机句柄返回值
int ret; //获得打印机任务返回值
TDateTime startTime;
Word Hour=0;
Word Hour1=0;
Word Min=0;
Word Min1=0;
Word Sec=0;
Word MSec=0;
int StartTime=0; //任务开始时间
int NowTime=0; //当前时间
int TotalTime=0; //任务停留时间
String str;
int length;
int PrintCount;
int InitCount=15; //设定的打印队列数量--------报警底线
int InitTime=10; //设定的打印队列事件--------报警底线(分钟)
PrintCount =CheckListBox1->Count ;
for (int i=0; i < PrintCount; i++)
{
//..............取得列表里的打印机
str=CheckListBox1->Items->Strings[i] ;
length=str.Length() ;
//................字符串到字符的转换,
StrPLCopy(buf,str,length);
//................获得打印机句柄
ret1= OpenPrinter(buf, &hPrinter, NULL);
//................获得打印任务数
ret= EnumJobs(hPrinter, 0, 127, 2,0, 0, &pcbNeeded, &pcReturned); //必要的一步,先取出打印机里任务的字节数,然后决定jobs1变量大小。//--------------------------①
//.................重定义Jobs1, 根据pcbNeeded决定使用哪个变量
if (pcbNeeded>size)
{
actNeed=pcbNeeded;
jobs1=new JOB_INFO_2[actNeed];
ret= EnumJobs(hPrinter, 0, 127, 2,(LPBYTE)jobs1, actNeed, &pcbNeeded, &pcReturned);
startTime=SystemTimeToDateTime(jobs1[0].Submitted); //------------------②
delete jobs1;
}
else
{
ret= EnumJobs(hPrinter, 0, 127, 2,(LPBYTE)jobs, size, &pcbNeeded, &pcReturned);//-----------------------------③
if (pcReturned>0)
startTime=SystemTimeToDateTime(jobs[0].Submitted);
}
//.................pcbNeeded>size结束
//................如果队列里有打印任务,比对数量与时间
if (pcReturned>0)
{
//.................时间转换,计算一天内的时间差
{
//............时间比较运算处理;
//............时间转换StartTime转换成分钟
}
DecodeTime(Now(),Hour1, Min1, Sec,MSec);
NowTime=Hour1*60+Min1;
TotalTime=NowTime-StartTime;
}
//依据条件判断是否报警
if ((pcReturned>InitCount) |(TotalTime >InitTime))
{
Beep();
}
pcReturned=0;
pcbNeeded=0;
}
//..........................pcReturned>0结束
}//....................................................for结束
甴曱
2007-04-06
打赏
举报
回复
取打印机的详细信息可以参考:http://www.codeproject.com/csharp/qPrintComponent.asp
hcl8260
2007-04-06
打赏
举报
回复
不懂,帮顶
c#
实现添加
打印机
c#
实现添加
打印机
,主要是通过 系统AddPrinterConnection() API 来实现,另附微软online supporter Jeffrey Tan的原邮件。
C#
实现获取
打印机
状态
C#
调用API实现获取默认
打印机
当前状态。
C#
添加网络
打印机
C#
添加网络
打印机
,前提是驱动都已装好的情况下
C#
打印机
监控系统 源码 打印
任务
监控 读取内存生成图片
C#
打印机
监控系统 打印
任务
监控 读取内存生成图片 ,实时监测 支持.spl文件转emf,需要的快下载吧
C#
获取
打印机
状态
C#
获取
打印机
状态,打印文件状态,
打印机
打印
队列
任务
数量
分析与设计
13,190
社区成员
5,759
社区内容
发帖
与我相关
我的任务
分析与设计
.NET技术 分析与设计
复制链接
扫一扫
分享
社区描述
.NET技术 分析与设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章