使用c#捕获windows的关机事件
在公司上班,下班时需要签退,而我呢隔三差五就会忘那么一次。怎么办呢,于是就想能不能捕获windows的关机事件,做一个程序让它在关机的时候提醒我一下呢。;o Q~S-o.|}K$}
非常幸运很容易就找到了Microsoft.Win32命名空间下面的SystemEvents类,他有一个静态的事件SessionEnding在系统注销或者关机时发生,此事件只有在winform的程序下有效,而在控制台程序下面无效,不能激发事件;还有一点我们必须在程序推出时将加上的事件移除掉,否则就容易造成内存溢出。
关键代码如下:
v7`i lm
以下是引用片段: o%R+R%lgM;Hi"|
using System;
using System.Collections.Generic; G7Gw2Ln ?CZ
using System.Windows.Forms; }#?aBGf!nT
using Microsoft.Win32; 2B }/l \NQ%[
namespace Shutdown *i6F|iw[Vw+}.s
{ ezh{:Jj\~K
static class Program (?/P.j@:e3R
{ U$j\$k-S9vX.Lq
/**////
/// 应用程序的主入口点。 0ml1P3P@`N!IiV
/// KK V2})nBb,jf
[STAThread]
static void Main() )p5U$Tuu:s4L
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); MQm2J6p v6B3b&v
FormShutdown formShutdown = new FormShutdown();
SystemEvents.SessionEnding += new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding); 8YJ @aWtY
Application.Run(formShutdown);
} (ww8RB'D\H
}
}Form 的代码: f'`YGG2Vw
using System;
using System.Collections.Generic; m%UEg5z Q
using System.ComponentModel; 9Dh%l$MPa$ex/y
using System.Data; G!d|cZ r
using System.Drawing;
using System.Text;
using System.Windows.Forms; 7U9vC7o$O*bOQ
using Microsoft.Win32;
namespace Shutdown
{
public partial class FormShutdown : Form +vQ%}])G R
{
const string MESSAGE_TXT = "您签退了吗?"; ._5{X,U:LM%y9d rZ4A
const string MESSAGE_TITLE = "提示"; 4aDP ~)u?9e#b
public FormShutdown()
{
InitializeComponent();
}
internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
DialogResult result = MessageBox.Show(MESSAGE_TXT, MESSAGE_TITLE, MessageBoxButtons.YesNo); d6A"u rI0~)\2z
e.Cancel = (result == DialogResult.No); 4G*y+Y+Wg }bI
}
private void FormShutdown_Load(object sender, EventArgs e)
{
this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 200, 0); 4H*}/_BK Q"JZdh?
}
protected override void OnClosed(EventArgs e)
{ %\G rJ^sy-M
SystemEvents.SessionEnding -= new SessionEndingEventHandler(this.SystemEvents_SessionEnding);
base.OnClosed(e);
} 9q T9c(IQ)O:sm
}
} L]/H~)l:g
&{V}wx7F0t
7j`0ad2L g-o
此程序在使用c#2.0在Windows2003下测试通过。大家在使用SystemEvents.SessionEnding事件时切记要在程序退出时移除事件。#qtv:N.Ly
.y+U8C4r{Jx^7ln
不过有两点遗憾之处:
F/Bt7n"jO
1. 使用这种方式不能捕获休眠时的事件
2. 这个程序占用的内存太多了,只有这么一个小功能居然占了12M的内存,这都是.Net framework惹的货;实在是不可思议。X0jSnn3\rw
6E G/Y+_,\
大家有没有什么好主意可以克服这两个缺点呢?
页:
[1]