怎样知道当前系统是否真正装了打印机(50分)

  • 主题发起人 主题发起人 wrench
  • 开始时间 开始时间
好像连office都检测不了哦.
 
将打印机的属性改一下,不要使用后台打印,而选择“直接打印在打印机上”,
这样windows(包括nt)就不会在后台打印,如果打印机错误,立即就会提示了
 
不用中断,用Createfile函数打开并口,对Printer发控制指令,
得到返回值再判断.一般控制指令应该是以esc打头的字符串
不过不同的打印机可能不同,如果是这样就不好解决了!你可以
先打印到文件,看看此打印机用的是什么指令.我在VC中用
Createfile对串口进行操作,对并口应该是一样的.再说
delphi不是有控件吗(我猜).再说现在的打印机驱动应该是
串并两用的.
 
各位,我再出200分(决不食言!)
有谁知道网络打印机的检测的话,另有300!
 
真的没有人知道吗?
 
EnumPrinters

VB声明
Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
说明
枚举系统中安装的打印机
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
flags Long,一个或多个下述标志
PRINTER_ENUM_LOCAL 枚举本地打印机(包括Windows 95中的网络打印机)。名字会被忽略
PRINTER_ENUM_NAME 枚举由name参数指定的打印机。其中的名字可以是一个供应商、域或服务器。如name为NULL,则枚举出可用的打印机
PRINTER_ENUM_SHARE 枚举共享打印机(必须同其他常数组合使用)
PRINTER_ENUM_CONNECTIONS 枚举网络连接列表中的打印机(即使目前没有连接——仅适用于NT)
PRINTER_ENUM_NETWORK 枚举通过网络连接的打印机。级别(Level)必须为1。仅适用于NT
PRINTER_ENUM_REMOTE 枚举通过网络连接的打印机和打印服务器。级别必须为1。仅适用于NT
name String,vbNullString表示枚举同本机连接的打印机。否则由标志和级别决定
Level Long,1,2,4或5(4仅适用于NT;5仅适用于Win95和NT 4.0),指定欲枚举的结构的类型。如果是1,则name参数由标志设置决定。如果是2或5,那么name就代表欲对其打印机进行枚举的服务器的名字;或者为vbNullString。如果是4,那么只有PRINTER_ENUM_LOCAL和PRINTER_ENUM_CONNECTIONS才有效。名字必须是vbNullString
pPrinterEnum Byte,包含PRINTER_ENUM_x结构的缓冲区,其中的x代表级别(Level)
cbBuf Long,pPrinterEnum缓冲区中的字符数量
pcbNeeded Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量
pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数)
注解
第4和第5级将它们的结构建立在系统注册表的基础上,而且比第2级快得多。后者要求每台打印机都处于打开状态
请参考微软Win32手册,了解这个函数进一步的情况

各种情况都有,怎样?
 
wrench,能解决么?
 
EnumJobs 返回在一个打开的打印机连机队列中的工作情况。
请参看WIN32 SDK帮助和 MSDN
1.OpenPrinter
2.如果是NT,考虑采用函数FindFirstPrinterChangeNotification
3.EnumJobs
3.ClosePrinter
 
skyrabbit的第三个可能应为enumprinters
 
这个问题是我的痛,我想判断一下网络打印机的状态。最好有个例子。
 
用眼睛看一下!用嘴问一下!(哈哈!如果这样回答也行的话)
 
根据在网上查询的资料 ,我用了如下代码,什么名称,打印作业数等都能知道,但
是状态值,始终为0,不知为何。

procedure TForm1.Button1Click(Sender: TObject);
var
prnhandle:thandle;
info:Pointer;
n:DWORD;
s1,s2,s3:array[0..1024]of char;
hmem:DWORD;
begin

if openprinter('Epson LQ-300K',prnhandle,nil) then

showmessage('Epson LQ-300K');
GetPrinter(prnhandle,2,@info,0,@n);
if( GetLastError()=122 )then

GetMem(info,n);
GetPrinter(prnhandle,2,info,n,@n) ;
if PRINTER_INFO_2(info^).Status=PRINTER_STATUS_OFFLINE then
ShowMessage('ok');
closeprinter(prnhandle);
end;
 
附加功能 将问题提前
 
附加功能 将问题提前
 
多人接受答案了。
 
to:all
怎样响应WM_SPOOLERSTATUS消息得到打印队列?
 
后退
顶部