我的一段程序如下
//声明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的参数应该怎么写?有没有实例参考一下啊

解决方案 »

  1.   

    这里有一个VB.NET版本的,可以参考一下:
    http://www.kbalertz.com/kb_821769.aspx有什么问题可以进一步讨论。
      

  2.   

    还有这里有一篇讨论也可以看看:http://www.codecomments.com/archive291-2004-4-175559.html
      

  3.   

    楼上的我试了不能检测出来,下面的是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
      

  4.   

    VB.NET的语法和C#很类似,你在开始的时候用的那种形式有什么问题?
      

  5.   

    我用上面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应该为打印任务的数量