VFP如何获取指定打印机里的打印任务的名称?

度年如日1668
企业官方账号
2015-11-25 10:45:42
想用VFP获取指定打印机中的任务的资料,例如

文档名,状态,所有者,提交时间 等等

有高手搞过没?
谢谢!
...全文
123 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2015-11-26
  • 打赏
  • 举报
回复
Declare Long GlobalAlloc in win32api ;
Long uFlags, ;
Long dwBytes
Declare Long GlobalFree in win32api ;
Long hMem
Declare Long OpenPrinter in winspool.drv ;
String pPrinterName, ;
Long @ phPrinter, ;
String pDefault
Declare Long ClosePrinter in winspool.drv ;
Long @ phPrinter
Declare Long EnumJobs in winspool.drv ;
Long hPrinter, ;
Long FirstJob, ;
Long NoJobs, ;
Long Level, ;
Long pJob, ;
Long cbBuf, ;
Long @ pcbNeeded, ;
Long @ pcReturned
Declare Long SystemTimeToTzSpecificLocalTime in win32api ;
String lpTimeZoneInformation, ;
String lpUniversalTime, ;
String @ lpLocalTimein
Declare Long GetLastError in win32api

m.cPrinterName = GetPrinter()
If Empty(m.cPrinterName)
MessageBox('没有选择要获取打印队列信息的打印机。', 64, '')
Return .f.
EndIf

m.hPrinter = 0
If 0 == OpenPrinter(m.cPrinterName + Chr(0), @ m.hPrinter, Null)
MessageBox('打开打印机失败。', 64, '')
Return .f.
EndIf

Try
m.pMem = 0
m.nNeedBytes = 0
m.nJobInfo = 0
If 0 == EnumJobs(m.hPrinter, 0, 100, 1, 0, 0, @ m.nNeedBytes, @ m.nJobInfo)
m.nErrNo = GetLastError()
If 122 != m.nErrNo
Error '枚举打印任务准备工作失败。错误码:' + Transform(m.nErrNo)
EndIf
EndIf

m.pMem = GlobalAlloc(0x0040, m.nNeedBytes)
If 0 == m.pMem
Error '分配内存失败。错误码:' + Transform(GetLastError())
EndIf

If 0 == EnumJobs(m.hPrinter, 0, 100, 1, m.pMem, m.nNeedBytes, @ m.nNeedBytes, @ m.nJobInfo)
Error '枚举打印任务失败。错误码:' + Transform(GetLastError())
EndIf
m.oErr = Null
Catch to m.oErr
EndTry

If IsNull(m.oErr)
m.cResult = Sys(2600, m.pMem, m.nNeedBytes)

Create Cursor printertask ( ;
文档名 V(50) ;
, 状态 V(50) ;
, 机器名 V(50) ;
, 所有者 V(50) ;
, 总页数 I ;
, 已打印页数 I ;
, 提交时间 T)

m.nStructSize = 12*4 + 16
m.oo = NewObject('Empty')
For m.ii = 1 to m.nJobInfo
m.cBlock = Substr(m.cResult, 1 + (m.ii - 1) * m.nStructSize, m.nStructSize)

m.cc = Sys(2600, CToBin(Substr(m.cBlock, 1 + 2*4, 4), 'rs'), 100)
m.nn = At(Chr(0), m.cc)
If m.nn > 0
m.cc = Left(m.cc, m.nn - 1)
EndIf
AddProperty(m.oo, '机器名', m.cc)

m.cc = Sys(2600, CToBin(Substr(m.cBlock, 1 + 3*4, 4), 'rs'), 100)
m.nn = At(Chr(0), m.cc)
If m.nn > 0
m.cc = Left(m.cc, m.nn - 1)
EndIf
AddProperty(m.oo, '所有者', m.cc)

m.cc = Sys(2600, CToBin(Substr(m.cBlock, 1 + 4*4, 4), 'rs'), 100)
m.nn = At(Chr(0), m.cc)
If m.nn > 0
m.cc = Left(m.cc, m.nn - 1)
EndIf
AddProperty(m.oo, '文档名', m.cc)

m.nn = CToBin(Substr(m.cBlock, 1 + 6*4, 4), 'rs')
If 0 == m.nn
m.nn = CToBin(Substr(m.cBlock, 1 + 7*4, 4), 'rs')
m.cc = ''
If Bittest(m.nn, 0)
m.cc = m.cc + ' - 已暂停'
EndIf
If Bittest(m.nn, 1)
m.cc = m.cc + ' - 错误'
EndIf
If Bittest(m.nn, 2)
m.cc = m.cc + ' - 正在删除'
EndIf
If Bittest(m.nn, 3)
m.cc = m.cc + ' - 脱机打印中'
EndIf
If Bittest(m.nn, 4)
m.cc = m.cc + ' - 正在打印'
EndIf
If Bittest(m.nn, 5)
m.cc = m.cc + ' - 已离线'
EndIf
If Bittest(m.nn, 6)
m.cc = m.cc + ' - 换页中'
EndIf
If Bittest(m.nn, 6)
m.cc = m.cc + ' - 打印完成'
EndIf
If Bittest(m.nn, 6)
m.cc = m.cc + ' - 已删除'
EndIf
m.cc = Ltrim(m.cc, ' - ')
Else
m.cc = Sys(2600, m.nn, 100)
m.nn = At(Chr(0), m.cc)
If m.nn > 0
m.cc = Left(m.cc, m.nn - 1)
EndIf
EndIf
AddProperty(m.oo, '状态', m.cc)

m.nn = CToBin(Substr(m.cBlock, 1 + 10*4, 4), 'rs')
AddProperty(m.oo, '总页数', m.nn)
m.nn = CToBin(Substr(m.cBlock, 1 + 11*4, 4), 'rs')
AddProperty(m.oo, '已打印页数', m.nn)

m.cc = Substr(m.cBlock, 1 + 12*4, 16)
m.cc2 = Replicate(Chr(0), 16)
SystemTimeToTzSpecificLocalTime(Null, m.cc, @ m.cc2)
m.cc = Transform(CToBin(Substr(m.cc2, 1, 2)+0h0000, 'rs')) ;
+ '-' + Transform(CToBin(Substr(m.cc2, 3, 2)+0h0000, 'rs')) ;
+ '-' + Transform(CToBin(Substr(m.cc2, 7, 2)+0h0000, 'rs')) ;
+ ' ' + Transform(CToBin(Substr(m.cc2, 9, 2)+0h0000, 'rs')) ;
+ ':' + Transform(CToBin(Substr(m.cc2, 11, 2)+0h0000, 'rs')) ;
+ ':' + Transform(CToBin(Substr(m.cc2, 13, 2)+0h0000, 'rs'))
AddProperty(m.oo, '提交时间', Ctot(m.cc))

Append blank
Gather name m.oo
EndFor
Else
Use in Select('printertask')
MessageBox(m.oErr.Message)
EndIf

If 0 != m.pMem
GlobalFree(m.pMem)
EndIf
If 0 != m.hPrinter
ClosePrinter(m.hPrinter)
EndIf

If Used('printertask')
Goto top in printertask
Browse nowait name oo
m.oo.Autofit()
EndIf
度年如日1668 2015-11-25
  • 打赏
  • 举报
回复
找到VB版本的了

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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