|
分類:[C#]
お世話になっております。hanayamaです。
C#でWin32APIを使用し、プリンタの情報を取得したいのですが、 現状のコードで正しいステータスが取れているかどうか不明です。
以下がコードです。長文ご容赦下さい。
***************************************************************************************
public class Sample { [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
[DllImport("winspool.drv", SetLastError = true)] private static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", SetLastError = true)] private static extern bool GetPrinter(IntPtr hPrinter, int dwLevel, IntPtr pPrinter, int cbBuf, out int pcbNeeded);
// JOB_INFO_2構造体定義 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct PRINTER_INFO_2 { public string pServerName; public string pPrinterName; public string pShareName; public string pPortName; public string pDriverName; public string pComment; public string pLocation; public IntPtr pDevMode; public string pSepFile; public string pPrintProcessor; public string pDatatype; public string pParameters; public IntPtr pSecurityDescriptor; public uint Attributes; public uint Priority; public uint DefaultPriority; public uint StartTime; public uint UntilTime; public uint Status; public uint cJobs; public uint AveragePPM; }
public PrinterInfo GetPrinterInfo(string printerName) { IntPtr hPrinter; // 返却用 PrinterInfo printerInfo = null; //プリンタのハンドルを取得する if (!OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) { throw new Exception("プリンタハンドル取得失敗"); }
IntPtr pPrinterInfo = IntPtr.Zero;
try { //必要なバイト数を取得する int needed; GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out needed); if (needed <= 0) throw new Exception("失敗しました。");
//メモリを割り当てる pPrinterInfo = Marshal.AllocHGlobal(needed);
//プリンタ情報を取得する int temp;
if (!GetPrinter(hPrinter, 2, pPrinterInfo, needed, out temp)) { throw new Exception("プリンタオープン失敗"); }
//PRINTER_INFO_2型にマーシャリングする PRINTER_INFO_2 printerInfo = (PRINTER_INFO_2)Marshal.PtrToStructure(pPrinterInfo, typeof(PRINTER_INFO_2));
printerInfo = new PrinterInfo();
printerInfo.PrinterName = printerName; printerInfo.DeviceName = printerInfo.pPrinterName; printerInfo.PortName = printerInfo.pPortName; printerInfo.JobCount = (int)printerInfo.cJobs; printerInfo.Status = (int)printerInfo.Status; } finally { //後始末をする ClosePrinter(hPrinter); Marshal.FreeHGlobal(pPrinterInfo); }
return printerInfo; } }
***************************************************************************************
上記コードをコンパイルしたアプリケーションを実行すると、プリンタ名からプリンタのハンドルを取得した後、 JOB_INFO_2構造体の情報を取得し、その中からさらにステータスを取得しているのですが、 コントロールパネルの「プリンタとFAX」からプリンタドライバをオフラインに変更しても アプリケーションで取得できるステータス(Status)が0(正常)のままとなります。 印刷中も同様にステータスが0のままです。 唯一、プリンタドライバのステータスを「中断」に変更した場合だけ ステータスが1(中断)となり、正しいステータスを取得できています。
私の認識だとJOB_INFO_2構造体の情報はプリンタドライバの情報を 取得するものだと思っているのですが、誤りでしょうか?
以上、ご教授お願いいたします。
|