WMI设备管理05


【文章标题】: WMI设备管理05
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
七、事件和WQL

设备管理允许客户程序在特定事件发生的时候收到通知.也就是所谓的事件.WMI事件和NET事件非常类似,但是它们的底层结构是完全不同的.而WQL则就是WMI 查询语言,它跟SQL非常类似,这里不做探讨,简单理解即可.

WMI事件分为三种:

1、定时器事件,由__IntervalTimerInstruction系统类表示.它的结构如下:

class  __IntervalTimerInstruction : __TimerInstruction
{
  uint32 IntervalBetweenEvents;
  boolean SkipIfPassed 
= FALSE;
  
string TimerId;
}
;

 PS:IntervalBetweenEvents应该设一个合理的数据,如果值太小,WMI将忽略它.

ManagementClass timerClass  =   new  ManagementClass( " __IntervalTimerInstruction " );
ManagementObject timer 
=  timerClass.CreateInstance();
timer[
" TimerId " =   " Timer1 " ;
timer[
" IntervalBetweenEvents " =   1000 ;
timer.Put();
//  预定计时器事件
//  创建计时器事件查询
WqlEventQuery query  =   new  WqlEventQuery( " __TimerEvent " " TimerId="Timer1" " );
//  初始化watcher,并预定query定义的事件
ManagementEventWatcher watcher  =   new  ManagementEventWatcher(query);
//  挂接事件的处理方法
watcher.EventArrived  +=  
          
new  EventArrivedEventHandler(( new  EventHandler()).HandleEvent);

//  开始侦停事件
watcher.Start();
//  暂停线程执行,以使watcher侦听事件
System.Threading.Thread.Sleep( 10000 );
//  停止事件预定
watcher.Stop();

通过查询Win32_LocalTime也可以达到定时操作服务的效果.

示例 -- 自动运行问题

//  TaskAutoRun.cs
//  Author by Yzl

using  System;
using  System.Management;

public   class  TaskAutoRun
{
    
public static void Main(string[] args)
    
{
        TaskAutoRun service 
= new TaskAutoRun();
        service.Start();
        
// 输入任意字符终止服务
        Console.ReadLine();
        service.Stop();
    }

    
    
// 启动服务
    public void Start()
    
{
        
if (!bStop)
        

            Console.WriteLine(
"已经启动服务.");
            
return;
        }

        
        Console.Write(
"正在启动服务...");
        watcher 
= new ManagementEventWatcher(
                    
new WqlEventQuery("__InstanceModificationEvent",
                    
" TargetInstance ISA 'Win32_LocalTime' AND " +
                    
" TargetInstance.Second=0"));
        
        MyHandler handler 
= new MyHandler();
        watcher.EventArrived 
+= new EventArrivedEventHandler(handler.Arrived);
        
        watcher.Start();
        bStop 
= false;
        Console.WriteLine(
" 启动完毕.");
    }

    
    
// 停止服务
    public void Stop()
    
{
        
if (bStop)
        
{
            Console.WriteLine(
"服务并未启动");
             
return;
        }

        Console.Write(
"正在停止服务...");
        watcher.Stop();
        Console.WriteLine(
" 已终止.");
    }

    
    
public class MyHandler
    
{
        
public void Arrived(object sender,EventArrivedEventArgs e)
        
{
            Console.WriteLine(
"时间到达,可执行任务!");
        }

    }

    
    
bool bStop = true;
    
private ManagementEventWatcher watcher;
}

编译运行:
E:/>TaskAutoRun
正在启动服务... 启动完毕.
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
时间到达,可执行任务!
q
正在停止服务... 已终止.

E:/>

这里程序的意思是当秒为0时,执行任务.具体设置可以参照如下WQL语言;
SELECT * FROM __InstanceModificationEvent
WHERE
    TargetInstance ISA "Win32_LocalTime"
    AND TargetInstance.Year = 2001
    AND TargetInstance.DayOfWeek=5
    AND TargetInstance.Hour=8  //可以把这里设置为12点,这样一到12点它便自动执行
    AND TargetInstance.Minute=0
    AND TargetInstance.Second=0


--------------------------------------------------------------------------------
【版权声明】: 本文原创于泉州软件基地, 转载请注明作者并保持文章的完整, 谢谢!


                                                       2007年03月15日 11:11:41

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值