100分求助:各位高手,我想获取打印机的状态信息,该如何处理啊!
各位高手,我想获取打印机的状态信息,在网上已经搜索一天了,有说用MScomm的,有用WINIO.DLL的,可是我一个也不会,各位高手帮帮我啊,谢谢!! 问题点数:100、回复次数:32Top
1 楼guoxinwei()回复于 2005-09-26 20:48:21 得分 0
在线等!Top
2 楼guoxinwei()回复于 2005-09-26 20:51:28 得分 0
大家帮帮我啊,领导催的很急!Top
3 楼guoxinwei()回复于 2005-09-26 20:57:32 得分 0
没有人知道吗?是Winform的,给点思路也行,我坐了一天,脖子疼的受不了!Top
4 楼usepc(usepc)回复于 2005-09-26 21:31:58 得分 5
http://community.csdn.net/Expert/topic/4138/4138007.xml?temp=.1959345Top
5 楼tslkfyh(TSL)回复于 2005-09-26 21:35:31 得分 0
UPTop
6 楼guoxinwei()回复于 2005-09-26 21:47:16 得分 0
谢谢usepc(usepc),可以给我一个更详细的说明吗?谢谢!!Top
7 楼guoxinwei()回复于 2005-09-26 21:53:25 得分 0
给点思路也行,最好是C#版的,谢谢了!Top
8 楼rainraid()回复于 2005-09-27 12:46:39 得分 0
帮你顶!Top
9 楼fsdy2000(乡愁)回复于 2005-09-27 13:14:26 得分 0
可以使用WMI进行查询Top
10 楼fsdy2000(乡愁)回复于 2005-09-27 13:24:15 得分 95
如:设置默认打印机
using System.Management;
private ManagementObjectSearcher query;
private ManagementObjectCollection queryCollection;
string _classname="SELECT * FROM Win32_Printer";
query=new ManagementObjectSearcher(_classname);
queryCollection = query.Get();
foreach (ManagementObject mo in queryCollection)
{
if (string.Compare(mo["Name"].ToString(),PrinterName,true)==0)
{
mo.InvokeMethod("SetDefaultPrinter",null); //调用了其方法,可修改此处获取相关状态属性
break;
}
}
相同的方法,你在得到具体的打印机实例时,可以获取到其相关属性,再显示出来即可。Top
11 楼guoxinwei()回复于 2005-09-27 15:00:22 得分 0
谢谢 fsdy2000(乡愁),你是高手,可否告诉我如何取消当前打印作业啊!我是指通过程序控制,就像VB里的KillDoc的一样Top
12 楼guoxinwei()回复于 2005-09-27 15:24:22 得分 0
各位高手,帮帮我啊,如何通过程序控制取消当前的打印作业,解决了就结贴!Top
13 楼YAOHE(吆喝)回复于 2005-09-27 15:42:56 得分 0
最近一年没有用上过打印控制,呵呵,帮不上忙,只好给你UPTop
14 楼guoxinwei()回复于 2005-09-27 15:46:19 得分 0
谢谢 YAOHE(吆喝),帮顶也谢谢!Top
15 楼guoxinwei()回复于 2005-09-27 16:38:25 得分 0
我刚才考虑是否可以用dos下的取消打印命令cancel,可是如何使用呢?Top
16 楼guoxinwei()回复于 2005-09-27 16:53:55 得分 0
不会没有人知道吧!要不我重新再开一个帖子!Top
17 楼fsdy2000(乡愁)回复于 2005-09-27 17:06:04 得分 0
你可以通过InvokeMethod("CancelAllJobs")取消打印。还有Pause/PrintTestPage/Rest等等Top
18 楼fsdy2000(乡愁)回复于 2005-09-27 17:09:06 得分 0
通过其AvailableJobSheets属性可获取到打印机上活动的打印任务Top
19 楼fsdy2000(乡愁)回复于 2005-09-27 17:13:00 得分 0
最好是使用名字为"Win32_PrintJob"的WMI类来完成你的工作。祝你成功!Top
20 楼guoxinwei()回复于 2005-09-27 17:20:48 得分 0
谢谢fsdy2000(乡愁),我用Win32_PrintJob试试。Top
21 楼guoxinwei()回复于 2005-09-27 17:49:40 得分 0
fsdy2000(乡愁)你好,我是C#新手,可否把InvokeMethod("CancelAllJobs")贴一段代码上来,我不会用,谢谢了!Top
22 楼guoxinwei()回复于 2005-09-27 21:11:18 得分 0
这是我的代码:public void CancelPrint()
{
ConnectionOptions co = new ConnectionOptions();
co.Impersonation = ImpersonationLevel.Impersonate;
co.EnablePrivileges = true;
ManagementScope mc = new ManagementScope(@"\ROOT\CIMV2", co);
ObjectQuery oQuery = new ObjectQuery("Select * from Win32_PrintJob");
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(mc, oQuery);
ManagementObjectCollection oReturnCollection = oSearcher.Get();
foreach( ManagementObject oReturn in oReturnCollection )
{
oReturn.InvokeMethod("CancelAllJobs",null);
}
}
错误信息如下:其他信息: 没有任何类别中执行这个方法Top
23 楼fsdy2000(乡愁)回复于 2005-09-28 09:37:12 得分 0
CancelAllJobs是Win32_Printer WMI类的方法,不是Win32_PrintJob的。如果是要取消某打印机所有的,就用"SELECT * FROM Win32_Printer",即再上面的例子,将其中的mo.InvokeMethod("SetDefaultPrinter",null); 改为mo.InvokeMethod("CancelAllJobs",null);Top
24 楼guoxinwei()回复于 2005-09-28 10:20:14 得分 0
fsdy2000(乡愁) ,谢谢,我按照上面的作了,可是该程序只能在win XP下使用,在Win2000下不能使用,该咋办!!2000的提示为:未处理的“System.Management.ManagementException”类型的异常出现在 system.management.dll 中。
其他信息: 没有任何类别中执行这个方法Top
25 楼fsdy2000(乡愁)回复于 2005-09-28 10:24:11 得分 0
win2000下应该也行,主要注意你在Win2000下WMI的安装,以及打印机驱动。Top
26 楼fsdy2000(乡愁)回复于 2005-09-28 10:27:28 得分 0
不好意思,该方法只能在WinXp以上。Top
27 楼guoxinwei()回复于 2005-09-28 10:27:29 得分 0
这是MSDN的提示:CancelAllJobs Method of the Win32_Printer Class
Requirements
Client Requires Windows "Longhorn" or Windows XP.
Server Requires Windows Server "Longhorn" or Windows Server 2003.
MOF Declared in Cimwin32.mof.
DLL Requires Cimwin32.dll.
Namespace Defined in \root\cimv2.
这是网址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_printer.asp
Top
28 楼guoxinwei()回复于 2005-09-28 10:28:12 得分 0
那该如何是好啊?Top
29 楼fsdy2000(乡愁)回复于 2005-09-28 10:33:23 得分 0
对打印机任务的操作都在WinXP以后才出现。如果你访问打印机状态信息可以使用WMI类。你的问题中只说明要“获取打印机的状态信息”,所以没有细研。你使用API函数来做"如何通过程序控制取消当前的打印作业"Top
30 楼guoxinwei()回复于 2005-09-28 10:36:39 得分 0
是的,都怪我没有说清楚。 fsdy2000(乡愁) ,你好,可否给我一个如何使用API函数来做取消当前的打印作业的例子吗?谢谢了!
Top
31 楼fsdy2000(乡愁)回复于 2005-09-28 10:55:33 得分 0
调gdi32.dll中的AbortDoc函数。或System.Drawing.Printing域下的类可能有帮助。你看看Top
32 楼guoxinwei()回复于 2005-09-28 11:11:52 得分 0
好的,我试试,gdi32.dll中有AbortDoc函数和abortPrinter函数,用哪个好呢?Top




