C#获取打印机状态

qq82557566 2010-09-15 04:17:36

class CSCPrintClass
{
public static string GetPrinterStatus(string PrinterName)
{
int intValue = GetPrinterStatusInt(PrinterName);
string strRet = string.Empty;
switch (intValue)
{
case 0:
strRet = "准备就绪(Ready)";
break;
case 0x00000200:
strRet = "忙(Busy)";
break;
case 0x00400000:
strRet = "被打开(Printer Door Open)";
break;
case 0x00000002:
strRet = "错误(Printer Error)";
break;
case 0x0008000:
strRet = "初始化(Initializing)";
break;
case 0x00000100:
strRet = "正在输入,输出(I/O Active)";
break;
case 0x00000020:
strRet = "手工送纸(Manual Feed)";
break;
case 0x00040000:
strRet = "无墨粉(No Toner)";
break;
case 0x00001000:
strRet = "不可用(Not Available)";
break;
case 0x00000080:
strRet = "脱机(Off Line)";
break;
case 0x00200000:
strRet = "内存溢出(Out of Memory)";
break;
case 0x00000800:
strRet = "输出口已满(Output Bin Full)";
break;
case 0x00080000:
strRet = "当前页无法打印(Page Punt)";
break;
case 0x00000008:
strRet = "塞纸(Paper Jam)";
break;
case 0x00000010:
strRet = "打印纸用完(Paper Out)";
break;
case 0x00000040:
strRet = "纸张问题(Page Problem)";
break;
case 0x00000001:
strRet = "暂停(Paused)";
break;
case 0x00000004:
strRet = "正在删除(Pending Deletion)";
break;
case 0x00000400:
strRet = "正在打印(Printing)";
break;
case 0x00004000:
strRet = "正在处理(Processing)";
break;
case 0x00020000:
strRet = "墨粉不足(Toner Low)";
break;
case 0x00100000:
strRet = "需要用户干预(User Intervention)";
break;
case 0x20000000:
strRet = "等待(Waiting)";
break;
case 0x00010000:
strRet = "热机中(Warming Up)";
break;
default:
strRet = "未知状态(Unknown Status)";
break;
}
return strRet;
}

[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool OpenPrinter(string printer, out IntPtr handle, ref structPrinterDefaults pDefault);
[DllImport("winspool.drv")]
public static extern bool ClosePrinter(IntPtr handle);
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool GetPrinter(IntPtr handle, Int32 level, IntPtr buffer, Int32 size, out Int32 sizeNeeded);

internal static int GetPrinterStatusInt(string PrinterName)
{
int intRet = 0;
IntPtr hPrinter;


structPrinterDefaults defaults = new structPrinterDefaults();


if (OpenPrinter(PrinterName, out hPrinter, ref defaults))
{
int cbNeeded = 0;
bool bolRet = GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out cbNeeded);
if (cbNeeded > 0)
{
IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
bolRet = GetPrinter(hPrinter, 2, pAddr, cbNeeded, out cbNeeded);
if (bolRet)
{
PRINTER_INFO_2 Info2 = new PRINTER_INFO_2();

Info2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2));

intRet = System.Convert.ToInt32(Info2.Status);
}
Marshal.FreeHGlobal(pAddr);
}
ClosePrinter(hPrinter);
}

return intRet;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal struct structPrinterDefaults
{
[MarshalAs(UnmanagedType.LPTStr)]
public String pDatatype;
public IntPtr pDevMode;
[MarshalAs(UnmanagedType.I4)]
public int DesiredAccess;
};

//状态枚举
[FlagsAttribute]
internal enum PrinterStatus
{
PRINTER_STATUS_BUSY = 0x00000200,
PRINTER_STATUS_DOOR_OPEN = 0x00400000,
PRINTER_STATUS_ERROR = 0x00000002,
PRINTER_STATUS_INITIALIZING = 0x00008000,
PRINTER_STATUS_IO_ACTIVE = 0x00000100,
PRINTER_STATUS_MANUAL_FEED = 0x00000020,
PRINTER_STATUS_NO_TONER = 0x00040000,
PRINTER_STATUS_NOT_AVAILABLE = 0x00001000,
PRINTER_STATUS_OFFLINE = 0x00000080,
PRINTER_STATUS_OUT_OF_MEMORY = 0x00200000,
PRINTER_STATUS_OUTPUT_BIN_FULL = 0x00000800,
PRINTER_STATUS_PAGE_PUNT = 0x00080000,
PRINTER_STATUS_PAPER_JAM = 0x00000008,
PRINTER_STATUS_PAPER_OUT = 0x00000010,
PRINTER_STATUS_PAPER_PROBLEM = 0x00000040,
PRINTER_STATUS_PAUSED = 0x00000001,
PRINTER_STATUS_PENDING_DELETION = 0x00000004,
PRINTER_STATUS_PRINTING = 0x00000400,
PRINTER_STATUS_PROCESSING = 0x00004000,
PRINTER_STATUS_TONER_LOW = 0x00020000,
PRINTER_STATUS_USER_INTERVENTION = 0x00100000,
PRINTER_STATUS_WAITING = 0x20000000,
PRINTER_STATUS_WARMING_UP = 0x00010000
}

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 UInt32 Attributes;
public UInt32 Priority;
public UInt32 DefaultPriority;
public UInt32 StartTime;
public UInt32 UntilTime;
public UInt32 Status;
public UInt32 cJobs;
public UInt32 AveragePPM;
}
public static void Main()
{
Console.WriteLine(CSCPrintClass.GetPrinterStatus("EPSON LQ-680K II ESC/P2").ToString());
Console.ReadLine();
}
}

我现在遇到的问题是:
1,我打印机没有连接,调用OpenPrinter函数返回的也是true;
2,GetPrinter函数返回的一直是0(准备就绪(Ready));
请各位能帮我解决,谢谢!!!

...全文
2720 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
coco_520 2012-08-17
  • 打赏
  • 举报
回复
如需要阅读该回复,请登录或注册CSDN!
娘的,爷登了,还报这错,fuck!
st200316 2012-06-10
  • 打赏
  • 举报
回复
登录了 也看不到回复 怎么回事呢 ?
qq82557566 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 aqaq2 的回复:]
LZ解决了问题分享一下啊~~~
[/Quote]
都快1年了,,,, 我后来的做法是调用OPOS,,而OPOS内的stateUpdateEvent事件会返回一个状态,,再OPOS给的测试程序中,提到过那些状态码各自的意识.

aqaq2 2011-08-01
  • 打赏
  • 举报
回复
LZ解决了问题分享一下啊~~~
crf_long 2011-02-18
  • 打赏
  • 举报
回复
lou楼主问题解决了没有啊 我遇到了同样的问题 不知怎么弄 共享一下呗
gxyflyto 2011-01-21
  • 打赏
  • 举报
回复
樓主,問題解決了嗎?我遇到了同樣的問題,要是解決了,還望共享出來啊
VCACC 2011-01-21
  • 打赏
  • 举报
回复
收藏先。
yinqiuyan 2010-11-23
  • 打赏
  • 举报
回复
请问这位版主高手,有没有一个小实例看看,获取打印机和传真 界面上的打印机列表还有打印机打印任务状态,是正在打印还是已取消 等状态,非常感谢
qq82557566 2010-09-21
  • 打赏
  • 举报
回复
找EPSON工程师去
qq82557566 2010-09-20
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/322091/zh-cn

此地址是写入数据到打印机,状态还是没有获取到。。。
qq82557566 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]

这段代码存在问题
参考
[/Quote]

谢谢你的提供的代码,,,但是我现在存在一个问题。。 我现在可以获取到我当前PC默认打印机,但是获取当前指定打印机的状态一直返回的是0。。
qq82557566 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gongsun 的回复:]

引用 6 楼 qq82557566 的回复:
在 structPrinterDefaults中的参数(vb的赋值方式)

pDatatype String,打印机使用的默认数据类型的名字。可设为vbNullString,表示使用当前的默认配置
pDevMode Long,打印机默认配置信息的一个地址。可设为零,表示使用当前默认设置
DesiredAccess Long,PRINTER_……
[/Quote]

他给的例子出现的问题。 也跟你在4楼回复的一样。。。 导致获取状态。 一直都是0。
gongsun 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq82557566 的回复:]
在 structPrinterDefaults中的参数(vb的赋值方式)

pDatatype String,打印机使用的默认数据类型的名字。可设为vbNullString,表示使用当前的默认配置
pDevMode Long,打印机默认配置信息的一个地址。可设为零,表示使用当前默认设置
DesiredAccess Long,PRINTER_ACCESS_ADMINISTER 或 PRINT……
[/Quote]

看看 如梦给你的例子,自己写!
wuyq11 2010-09-15
  • 打赏
  • 举报
回复
这段代码存在问题
参考
qq82557566 2010-09-15
  • 打赏
  • 举报
回复
在 structPrinterDefaults中的参数(vb的赋值方式)

pDatatype String,打印机使用的默认数据类型的名字。可设为vbNullString,表示使用当前的默认配置
pDevMode Long,打印机默认配置信息的一个地址。可设为零,表示使用当前默认设置
DesiredAccess Long,PRINTER_ACCESS_ADMINISTER 或 PRINTER_ACCESS_USE,或者是一个常规的安全值(取决于您是需要配置打印机,还是仅仅访问它)

但是我在C#里面不知道什么赋值;
qq82557566 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gongsun 的回复:]

真是 达叔, 换了别人 我肯定懒的看这么多代码了。。。

---------------------

看这里:

structPrinterDefaults defaults = new structPrinterDefaults();

if (OpenPrinter(PrinterName, out hPrinter, ref defaults))

--------……
[/Quote]

呵呵。 谢谢你的回答。。 structPrinterDefaults是一个我已经定义了的结构,而应该怎么赋值,不知道。
gongsun 2010-09-15
  • 打赏
  • 举报
回复
真是 达叔, 换了别人 我肯定懒的看这么多代码了。。。

---------------------

看这里:

structPrinterDefaults defaults = new structPrinterDefaults();

if (OpenPrinter(PrinterName, out hPrinter, ref defaults))

----------------
你实例化了一个 structPrinterDefaults 对象。

ref defaults 中的 defaults 你需要给它 赋 初始值

这是 ref 和 out 的区别。

你有给这个 defaults 赋值吗???
qq82557566 2010-09-15
  • 打赏
  • 举报
回复
请不用给我贴一些地址,, 我看了很多了。。 暂时感觉就这个代码可以实现我的需求,
希望下面的朋友们。 能帮忙拿着我的代码。 帮忙看下。 我是什么错误。 谢谢!
让爱延续 2010-09-15
  • 打赏
  • 举报
回复
学习中…

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧