【文章标题】: WMI设备管理05
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
七、事件和WQL
设备管理允许客户程序在特定事件发生的时候收到通知.也就是所谓的事件.WMI事件和NET事件非常类似,但是它们的底层结构是完全不同的.而WQL则就是WMI 查询语言,它跟SQL非常类似,这里不做探讨,简单理解即可.
WMI事件分为三种:
1、定时器事件,由__IntervalTimerInstruction系统类表示.它的结构如下:
... {
uint32 IntervalBetweenEvents;
boolean SkipIfPassed = FALSE;
string TimerId;
} ;
PS:IntervalBetweenEvents应该设一个合理的数据,如果值太小,WMI将忽略它.
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也可以达到定时操作服务的效果.
示例 -- 自动运行问题
// 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