C#中获取打印机当前状态 (打印机是否有纸) 100分求救。

zjm1231 2011-05-24 09:34:30
RT。。各位大大,,帮帮忙吧。。
PS:网上找了很多,,都用不了,希望能有自己用过的,然后知道用怎么用那些API之类的指导下。。先谢了
解决了另外开贴送100分,,现在只能给100。。。
...全文
729 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
未页 2012-11-01
  • 打赏
  • 举报
回复
private void isPapeout()
{
PrintServer myPrintServer = new PrintServer();
PrintQueue pringQueue;
try
{
pringQueue = myPrintServer.GetPrintQueue(printDocument1.PrinterSettings.PrinterName);
foreach (PrintSystemJobInfo job in pringQueue.GetPrintJobInfoCollection())
{
if (job.IsPaperOut==true)
{
MessageBox.Show("缺纸!");
}
else { MessageBox.Show("有纸!"); }
}
}
catch { MessageBox.Show("错误!"); }

}
百事洞明 2011-05-31
  • 打赏
  • 举报
回复
API 或者引用SYSTEM.MAN..
zjm1231 2011-05-31
  • 打赏
  • 举报
回复
!,回楼上的这位大侠,,
用你的方法掉API使用后。。获取的状态全部是READY。。晕死。
etangelsky 2011-05-31
  • 打赏
  • 举报
回复
哎,这个好啊
小case 2011-05-31
  • 打赏
  • 举报
回复
楼主这个问题我觉得很难,除非针对1个型号打印机,1个操作系统
windows的打印管理器和网络邻居很垃圾,一直到win7也只是略有改善
zjm1231 2011-05-31
  • 打赏
  • 举报
回复
还有人吗??求救了,,帮帮。。
心灵彩虹 2011-05-30
  • 打赏
  • 举报
回复
  
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;
}

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
}

心灵彩虹 2011-05-30
  • 打赏
  • 举报
回复
调用PrintDocument.Print时,可能会出异常,捕获就可以了
ggw128 2011-05-30
  • 打赏
  • 举报
回复
看来应该要查一下打印机厂商的官网了。
jimh 2011-05-30
  • 打赏
  • 举报
回复
无法统一,例如有些打印机有多个进纸位置,有些打印机就只有一个位置,有些是上面进纸,有些是下面进纸,支持的纸张类型,大小都不同,没有统一的接口。
636f6c696e 2011-05-30
  • 打赏
  • 举报
回复
我感觉做不了,不同的打印机接口又不一样,还不一定有,怎么做呢?
zjm1231 2011-05-30
  • 打赏
  • 举报
回复
没人吗???求指教了,,唉,这个问题困扰很久了,实在不行我得说做不了了。
zjm1231 2011-05-30
  • 打赏
  • 举报
回复
..........来个人教教。。
zjm1231 2011-05-24
  • 打赏
  • 举报
回复
。。。。。。楼上的哥哥,,一直返回的是空闲状态啊,我那个蛋疼啊。。。
这些资料我都找到过的了
636f6c696e 2011-05-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/lijipan/archive/2005/04/18/352678.aspx
zjm1231 2011-05-24
  • 打赏
  • 举报
回复
网上找了不少,也照他们的DEMO用了那些个API什么的,可不行啊,,大大们帮帮忙了
IT0329 2011-05-24
  • 打赏
  • 举报
回复
这个你想用程序来实现?
jimh 2011-05-24
  • 打赏
  • 举报
回复
基本靠驱动提供API,没有通用的接口。
am 2011-05-24
  • 打赏
  • 举报
回复
应该问厂家,看看有没有提供接口
zjm1231 2011-05-24
  • 打赏
  • 举报
回复
好的先谢楼上了,,
另外跪求各位大大帮帮忙了。
加载更多回复(1)

110,534

社区成员

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

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

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