怎么使用API函数EnumJobs?

tayuly 2006-01-20 10:19:48
我的一段程序如下
//声明win32 api打开打印机 获得打印机句柄
[DllImport("winspool.drv", CharSet=CharSet.Auto)]
public static extern bool OpenPrinter( string pPrinterName, out IntPtr
phPrinter, IntPtr pDefault );
//声明win32 api关闭打印机 获得打印机句柄
[DllImport("winspool.drv",CharSet=CharSet.Auto)]
static extern bool ClosePrinter(IntPtr ptrPrinter);
[DllImport("Winspool.drv", SetLastError=true, EntryPoint="EnumJobsA")]
public static extern bool EnumJobs(
IntPtr hPrinter,
UInt32 FirstJob,
UInt32 NoJobs,
UInt32 Level,
IntPtr pJob,
UInt32 cbBuf,
out UInt32 pcbNeeded,
out UInt32 pcReturned
);
private void button1_Click(object sender, System.EventArgs e)
{
UInt32 dwNeeded, dwReturned;
PrintDocument prtdoc = new PrintDocument();
string strPrnName = prtdoc.PrinterSettings.PrinterName;
IntPtr prnHandle,ppp;
if(OpenPrinter(strPrnName,out prnHandle,IntPtr.Zero))
{
EnumJobs(prnHandle,0,0,1,ppp,1000,dwNeeded,dwReturned);//这里应该怎么写?
MessageBox.Show(dwReturned.ToString());
}
}
EnumJobs的参数应该怎么写?有没有实例参考一下啊
...全文
347 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tayuly 2006-01-22
  • 打赏
  • 举报
回复
我用上面vb的代码可以检测出来打印任务的数量,
但你提供的vb.net 和c#的例子都不能取出正确的值,代码如下
IntPtr handle;
int FirstJob = 0;
int NumJobs = 0;
int pcbNeeded;
int pcReturned;
PrinterSettings PS = new PrinterSettings();
OpenPrinter(PS.PrinterName, out handle, IntPtr.Zero );
this.textBox1.Text=PS.PrinterName;
// get num bytes required
EnumJobs ( handle, FirstJob, NumJobs, 1, IntPtr.Zero, 0, out pcbNeeded,out pcReturned);
MessageBox.Show(pcReturned.ToString());//这里取出来的值总是为0,pcReturned应该为打印任务的数量
tayuly 2006-01-20
  • 打赏
  • 举报
回复
楼上的我试了不能检测出来,下面的是VB的代码我把它作成DLL引入可以用,不过还是想用C#写,有高手能把下面的vb代码翻译成c#吗
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Private Sub Command1_Click()
Dim hPrinter As Long
Dim dwNeeded, dwReturned As Long
Dim b(1000) As Byte

If OpenPrinter("Canon Bubble-Jet BJ-10e", hPrinter, ByVal 0&) = 0 Then
Exit Sub
End If

EnumJobs hPrinter, 0, &HFFFFFFFF, 1, b(0), 1000, dwNeeded, _
dwReturned
MsgBox "有" & dwReturned & "个打印任务!"
ClosePrinter hPrinter
End Sub
s5689412 2006-01-20
  • 打赏
  • 举报
回复
还有这里有一篇讨论也可以看看:

http://www.codecomments.com/archive291-2004-4-175559.html
s5689412 2006-01-20
  • 打赏
  • 举报
回复
这里有一个VB.NET版本的,可以参考一下:
http://www.kbalertz.com/kb_821769.aspx

有什么问题可以进一步讨论。
s5689412 2006-01-20
  • 打赏
  • 举报
回复
VB.NET的语法和C#很类似,你在开始的时候用的那种形式有什么问题?

110,538

社区成员

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

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

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