//引入命名空间:using System.Runtime.InteropServices; [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool SetDefaultPrinter(string printerName); [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int pcchBuffer); [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... } /// <summary> /// 获取默认打印机 /// </summary> /// <returns></returns> public static string GetDefaultPrinter() { const int ERROR_FILE_NOT_FOUND = 2; const int ERROR_INSUFFICIENT_BUFFER = 122; int pcchBuffer = 0; if (GetDefaultPrinter(null, ref pcchBuffer)) { return ""; } int lastWin32Error = Marshal.GetLastWin32Error(); if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER) { StringBuilder pszBuffer = new StringBuilder(pcchBuffer); if (GetDefaultPrinter(pszBuffer, ref pcchBuffer)) { return pszBuffer.ToString(); } lastWin32Error = Marshal.GetLastWin32Error(); } if (lastWin32Error == ERROR_FILE_NOT_FOUND) { return ""; } return ""; } /// <summary> /// 获取打印机的打印列表 /// </summary> /// <param name="printName">打印机名称,本地</param> /// <returns>返回打印队列中文档名称字符串,多个之间用逗号连接</returns> public static string GetPrintJobs(string printName) { StringBuilder result = new StringBuilder(); IntPtr handle; int FirstJob = 0; int NumJobs = 127; int pcbNeeded; int pcReturned; // open printer OpenPrinter(printName, 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)); result.Append(jobs[i].pDocument); result.Append(","); pTemp += Marshal.SizeOf(typeof(JOB_INFO_1)); } // cleanup unmanaged memory Marshal.FreeHGlobal(pData); // close printer ClosePrinter(handle); return result.ToString(); } private void timer1_Tick(object sender, EventArgs e) { string strJob = GetPrintJobs(textBox2.Text); strJob = string.IsNullOrWhiteSpace(strJob) ? "空" : strJob; textBox3.Text = textBox3.Text + strJob + "\r\n"; }
标签:IntPtr,打印机,string,C#,CharSet,队列,int,public,out From: https://www.cnblogs.com/handsomeziff/p/17336556.html