各位高手,我想获取打印机的状态信息,在网上已经搜索一天了,有说用MScomm的,有用WINIO.DLL的,可是我一个也不会,各位高手帮帮我啊,谢谢!!

解决方案 »

  1.   

    没有人知道吗?是Winform的,给点思路也行,我坐了一天,脖子疼的受不了!
      

  2.   

    http://community.csdn.net/Expert/topic/4138/4138007.xml?temp=.1959345
      

  3.   

    谢谢usepc(usepc),可以给我一个更详细的说明吗?谢谢!!
      

  4.   

    如:设置默认打印机
    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;
        }
     }
    相同的方法,你在得到具体的打印机实例时,可以获取到其相关属性,再显示出来即可。
      

  5.   

    谢谢 fsdy2000(乡愁),你是高手,可否告诉我如何取消当前打印作业啊!我是指通过程序控制,就像VB里的KillDoc的一样
      

  6.   

    我刚才考虑是否可以用dos下的取消打印命令cancel,可是如何使用呢?
      

  7.   

    你可以通过InvokeMethod("CancelAllJobs")取消打印。还有Pause/PrintTestPage/Rest等等
      

  8.   

    通过其AvailableJobSheets属性可获取到打印机上活动的打印任务
      

  9.   

    最好是使用名字为"Win32_PrintJob"的WMI类来完成你的工作。祝你成功!
      

  10.   

    谢谢fsdy2000(乡愁),我用Win32_PrintJob试试。
      

  11.   

    fsdy2000(乡愁)你好,我是C#新手,可否把InvokeMethod("CancelAllJobs")贴一段代码上来,我不会用,谢谢了!
      

  12.   

    这是我的代码: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);
    }
    }
    错误信息如下:其他信息: 没有任何类别中执行这个方法
      

  13.   

    CancelAllJobs是Win32_Printer WMI类的方法,不是Win32_PrintJob的。如果是要取消某打印机所有的,就用"SELECT * FROM Win32_Printer",即再上面的例子,将其中的mo.InvokeMethod("SetDefaultPrinter",null); 改为mo.InvokeMethod("CancelAllJobs",null);
      

  14.   

    fsdy2000(乡愁) ,谢谢,我按照上面的作了,可是该程序只能在win XP下使用,在Win2000下不能使用,该咋办!!2000的提示为:未处理的“System.Management.ManagementException”类型的异常出现在 system.management.dll 中。其他信息: 没有任何类别中执行这个方法
      

  15.   

    win2000下应该也行,主要注意你在Win2000下WMI的安装,以及打印机驱动。
      

  16.   

    不好意思,该方法只能在WinXp以上。
      

  17.   

    这是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
     
      

  18.   

    对打印机任务的操作都在WinXP以后才出现。如果你访问打印机状态信息可以使用WMI类。你的问题中只说明要“获取打印机的状态信息”,所以没有细研。你使用API函数来做"如何通过程序控制取消当前的打印作业"
      

  19.   

    是的,都怪我没有说清楚。 fsdy2000(乡愁) ,你好,可否给我一个如何使用API函数来做取消当前的打印作业的例子吗?谢谢了!
      

  20.   

    调gdi32.dll中的AbortDoc函数。或System.Drawing.Printing域下的类可能有帮助。你看看
      

  21.   

    好的,我试试,gdi32.dll中有AbortDoc函数和abortPrinter函数,用哪个好呢?