关于c#监控打印机的问题(论坛中没有打印机版块,暂时发这里了)

jol_boy 2012-11-21 05:01:14
目前c#去监控本地安装的打印机,包括网络打印机,这块都实现了,调用的winAPI实现的,目的是想要阻止用户打印,用户打印的时候,如果选择其他的打印机,任务将被拦截,并且清空打印任务,提醒用户使用我们提供的虚拟打印机进行打印.

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

希望有经验的人指点一下,如果有更好的监控拦截方式,请不吝赐教,小弟感激不尽.
...全文
774 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
p1175138817 2015-05-19
  • 打赏
  • 举报
回复
引用 9 楼 lichaoasd 的回复:
我现在也在做打印机打印,现在要做个监控打印机状态的,卡纸,异常等的所有状态。。。我用了很多方法都没法获取得到打印机的真实状态....有什么方法可以拿到真实的状态吗,求解????
亲,你这个问题解决了吗吗
wodecuoshi230 2013-09-10
  • 打赏
  • 举报
回复
“不管什么类型的打印机,最终还是要在你本机进行安装的,我就监控本机安装的所有打印机的打印队列,除了我自己提供的虚拟打印机除外.” 想实现功能,监听打印池,删除所有打印作业。 当连续点击打印时,有些打印任务已经在打印机端进行打印了 while (true) { // Query to get all the queued printer jobs. string searchQuery = "SELECT * FROM Win32_PrintJob"; // Create an object using the above query. ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery); // Fire the query to get the collection of the printer jobs. ManagementObjectCollection prntJobCollection = searchPrintJobs.Get(); // Look for the job you want to delete/cancel. foreach (ManagementObject prntJob in prntJobCollection) { //delete job prntJob.Delete(); } } 请教楼主指点
jol_boy 2012-11-23
  • 打赏
  • 举报
回复
使用了钩子,在发出打印命令,数据还未到达本机那个打印管理器的时候,就拦截,只可惜,这种方式容易被杀毒软件拦截..... 目前出现了更奇妙的现象,A机发起打印,产生的任务,出现在B机,B机又将这个任务返回给了A机,导致A机发起的打印任务,会出现2条,甚至3条,N条,只要打印不结束,就会不断的A给B,B给A,如同镜子照镜子一样,太悲剧了,这么多年以来,一直不知道打印机还有这功能....
jol_boy 2012-11-22
  • 打赏
  • 举报
回复
不管什么类型的打印机,最终还是要在你本机进行安装的,我就监控本机安装的所有打印机的打印队列,除了我自己提供的虚拟打印机除外. 至于获取打印机什么状态,我到反而不关心,不管什么状态,只要出现打印任务,一律干掉. 打印队列里面的确可以获取到所有者,但是取到的是用户名,如administrator(但用这个账户的太多了,不能做唯一性判断),机器名有的机器能获取到,有的机器却获取不到,也不能作唯一性判断. 目前唯一发现的是,本机提交的打印作业,jobid一般都不大,因为本机打印的次数较少,但是别的机器提交的打印作业,出现在本机时,获取到的jobid,都是很大的数值,但是目前没找到规律.msdn上也没找到关于jobid数值的相关定义,只是说这个jobid就像自动增长列一样,你打印了多少次,每次都会+1递增. 咨询了打印机厂家,厂家的回复说,不可能出现别人的打印任务出现在自己的机器上. 悲剧的...
lichaoasd 2012-11-22
  • 打赏
  • 举报
回复
监控打印机,包括网络的打印机.请问下是怎么实现的,我用了WMI,Win32_Printer 去获取打印机状态的,,无论打印是否连接上,或者卡纸,或者打开盖了,没纸,可是返回的结果总是正常的....你调用的winAPI是什么
心灵彩虹 2012-11-22
  • 打赏
  • 举报
回复
参考http://www.cnblogs.com/luckeryin/archive/2009/07/13/1522775.html
心灵彩虹 2012-11-22
  • 打赏
  • 举报
回复
获取打印任务

 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;   
          }   
    }   

51Crack 2012-11-22
  • 打赏
  • 举报
回复
共享的打印机你能监控到不?! \\..\.
csdn_风中雪狼 2012-11-22
  • 打赏
  • 举报
回复
没有搞过这方面的,高深 不过你可以根据打印队列中打印所有者来进行对比, 看看,当前打印文档的所有者,是否是本机的计算机名,如果则提示,如果不是则不弹出提示 具体没有测试过, 只是提供一个思路, 不知道是是否可行
jol_boy 2012-11-22
  • 打赏
  • 举报
回复
难道没人遇到过?
XBodhi. 2012-11-22
  • 打赏
  • 举报
回复
用网络打印机也要在客户端装驱动的这是无法避免的了。
lichaoasd 2012-11-22
  • 打赏
  • 举报
回复
我现在也在做打印机打印,现在要做个监控打印机状态的,卡纸,异常等的所有状态。。。我用了很多方法都没法获取得到打印机的真实状态....有什么方法可以拿到真实的状态吗,求解????

111,097

社区成员

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

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

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