我的一段程序如下
//声明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的参数应该怎么写?有没有实例参考一下啊
//声明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的参数应该怎么写?有没有实例参考一下啊
解决方案 »
- sp.net SWFUpload 上传文件 报错 :服务器IO错悟 为什吗啊
- 求一段代码 实现无边框窗体 改变大小(C#)
- 问个Hashtable的问题
- 向C#高手请教, 如何完全控制IE?
- 我用NHibernate取到了条记录在Ilist里, 我怎么样把Ilist里的内容取出来呢?
- 大家帮忙看看这段调用API的代码出什么问题了(没分了Sorry)
- C#中多窗体之间的数据传递,急!!!!!!!!!!
- 一个不知原理的错误
- 正则验证decimal类型,咋么写?
- 如何在线程中操纵窗口对象
- Timer里面MessageBox问题?
- 急求.net 2005 连接 sql server 2000 故障解决方案
http://www.kbalertz.com/kb_821769.aspx有什么问题可以进一步讨论。
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
但你提供的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应该为打印任务的数量