using System;using System.Collections.Generic;using System.Text;using System.Management;using System.Net;namespace testPrintJobArrival{public delegate void PrintJobArrived(object sender, ManagementBaseObject printProperties);public class WMIPrinter{ConnectionOptions _co = new ConnectionOptions();internal static System.Management.ManagementScope _ms = null;private const string PRINTERJOBS = "SELECT * FROM Win32_PrintJob";private const string PRINTERS = "SELECT * FROM Win32_Printer";private const int QUERYINTERVAL = 1;public PrintJobArrived OnPrintJobArrived = null;private System.Management.ManagementEventWatcher _printEventWatcher = null;private ManagementObjectSearcher _moSearchPrintJobs = null;public WMIPrinter(){ //Point to machine_co.EnablePrivileges = true;_co.Impersonation = ImpersonationLevel.Delegate;_ms = new System.Management.ManagementScope("\\\\localhost\\root\\cimv2", _co);_moSearchPrintJobs = new ManagementObjectSearcher(PRINTERJOBS);}public void StartPrintWatcher(){_printEventWatcher = new System.Management.ManagementEventWatcher();_printEventWatcher.Query = new System.Management.EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN " + QUERYINTERVAL + " WHERE TargetInstance ISA \"Win32_PrintJob\"");string hostName = Dns.GetHostName();this._printEventWatcher.Scope = new System.Management.ManagementScope("\\\\" + hostName + "\\root\\CIMV2");_printEventWatcher.EventArrived += new EventArrivedEventHandler(this.Arrived); _printEventWatcher.Start(); //asynchronous//_printEventWatcher.WaitForNextEvent(); //synchronous}public void StopPrintWatcher(){if (_printEventWatcher != null)_printEventWatcher.Stop();}/// <summary>/// new Print Job has Arrived.../// </summary>/// <param name="sender"></param>/// <param name="e"></param>public void Arrived(object sender, EventArrivedEventArgs e){foreach (PropertyData pd in e.NewEvent.Properties){ManagementBaseObject mbo = pd.Value as ManagementBaseObject;if (mbo != null){//mbo.Properties[""]if (OnPrintJobArrived != null)OnPrintJobArrived(this, mbo);}}}}}
上面delegate 的使用有问题!

解决方案 »

  1.   


    zgke 做过吗??事件检测不到啊。??
      

  2.   

    在提出有关delegate 的问题之前,请先了解C里面的函数指针类型的用法……放到C#中,换了个叫法,叫做delegate
      

  3.   


    zgke  做过吗?? 打印事件检测不到啊???
      

  4.   

    这段代码我是从网上搜到的,正在看
    _printEventWatcher.EventArrived += new EventArrivedEventHandler(this.Arrived);这句有哪位请解释一下!!
      

  5.   

    _printEventWatcher.EventArrived += new EventArrivedEventHandler(this.Arrived);
    在Arrived函数中
    public void Arrived(object sender, EventArrivedEventArgs e){
       foreach (PropertyData pd in e.NewEvent.Properties)
       {
           ManagementBaseObject mbo = pd.Value as ManagementBaseObject;
           if (mbo != null)
           {
              if (OnPrintJobArrived != null)
              OnPrintJobArrived(this, mbo);    
              这里是怎么调用的,请解释一下??
           }
       }
    }
      

  6.   

    OnPrintJobArrived(this, mbo);    
              [这里是怎么调用的,请解释一下??
      

  7.   

    EventArrivedEventArgs e 里面那个属性是表示当前事件的??
      

  8.   

    delegate 是委托 建议装个msdn 看看一些用法