日期:2014-05-17  浏览次数:21004 次

关于c#监控打印机的问题(论坛中没有打印机版块,暂时发这里了)
目前c#去监控本地安装的打印机,包括网络打印机,这块都实现了,调用的winAPI实现的,目的是想要阻止用户打印,用户打印的时候,如果选择其他的打印机,任务将被拦截,并且清空打印任务,提醒用户使用我们提供的虚拟打印机进行打印.

目前我采取的拦截手段是,随机启动一个系统服务程序,实时监控PC机上安装的所有打印机,在打印队列中一旦出现打印任务,立刻清除.
现在的问题是:
在我的电脑上,打印队列中,很奇怪的出现了其他用户的打印任务,打印机是网络打印机,所有用户都是直接连接到网络打印机上的,相互之间并没有共享打印机,而且,网络打印机也无法共享,这就导致,我在拦截的时候,拦到了不是本机发出的打印任务,用户没打印,却会弹出提醒框,比较郁闷,无法区分出来,到底是本机的打印任务还是别人的打印任务.

希望有经验的人指点一下,如果有更好的监控拦截方式,请不吝赐教,小弟感激不尽.

------解决方案--------------------
没有搞过这方面的,高深
不过你可以根据打印队列中打印所有者来进行对比,
看看,当前打印文档的所有者,是否是本机的计算机名,如果则提示,如果不是则不弹出提示
具体没有测试过,
只是提供一个思路,
不知道是是否可行
------解决方案--------------------
共享的打印机你能监控到不?!
\\..\.
------解决方案--------------------
获取打印任务

 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);       //调用了其方法,可修改此处获取相关状态属性