在 C# 中使用 EnumJobs 查看列印佇列中之工作清單

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
    public short wYear;
    public short wMonth;
    public short wDayOfWeek;
    public short wDay;
    public short wHour;
    public short wMinute;
    public short wSecond;
    public short wMilliseconds;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct JOB_INFO_1
{
    public int JobId;
    public string pPrinterName;
    public string pMachineName;
    public string pUserName;
    public string pDocument;
    public string pDatatype;
    public string pStatus;
    public int Status;
    public int Priority;
    public int Position;
    public int TotalPages;
    public int PagesPrinted;
    public SYSTEMTIME Submitted;
}

[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault);

[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool ClosePrinter(IntPtr hPrinter);

[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern int EnumJobs(IntPtr hPrinter, int FirstJob, int NoJobs, int Level, IntPtr pInfo, int cdBuf,
                                  out int pcbNeeded, out int pcReturned);

private static void peekPrinterJobs(string printerToPeek)
{
    IntPtr handle;
    int FirstJob = 0;
    int NumJobs = 127;
    int pcbNeeded;
    int pcReturned;

    // open printer
    OpenPrinter(printerToPeek, out handle, IntPtr.Zero);

    // get num bytes required, here we assume the maxt job for the printer quest is 128 (0..127)
    EnumJobs(handle, FirstJob, NumJobs, 1, IntPtr.Zero, 0, out pcbNeeded, out pcReturned);

    // allocate unmanaged memory
    IntPtr pData = Marshal.AllocHGlobal(pcbNeeded);

    // get structs
    EnumJobs(handle, FirstJob, NumJobs, 1, pData, pcbNeeded, out pcbNeeded, out pcReturned);

    // create array of managed job structs
    JOB_INFO_1[] jobs = new JOB_INFO_1[pcReturned];

    // marshal struct to managed
    int pTemp = pData.ToInt32(); //start pointer
    for (int i = 0; i < pcReturned; ++i)
    {
        jobs[i] = (JOB_INFO_1) Marshal.PtrToStructure(new IntPtr(pTemp), typeof (JOB_INFO_1));
        pTemp += Marshal.SizeOf(typeof (JOB_INFO_1));
    }

    // cleanup unmanaged memory
    Marshal.FreeHGlobal(pData);

    // close printer
    ClosePrinter(handle);

    // printer jobs are in the jobs array now, do what you want to...
}

 

此文转自:

http://www.cine.idv.tw/learning/applied-sciences/computer-science/programming/.net/5728-c-4e2d4f7f7528-enumjobs-67e5770b521753704f4752174e2d4e4b5de54f5c6e0555ae

转载于:https://www.cnblogs.com/waxic/archive/2009/05/07/1451952.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值