zoukankan      html  css  js  c++  java
  • 使用c#捕获windows的关机事件

    在公司上班,下班时需要签退,而我呢隔三差五就会忘那么一次。怎么办呢,于是就想能不能捕获windows的关机事件,做一个程序让它在关机的时候提醒我一下呢。

     

    非常幸运很容易就找到了Microsoft.Win32命名空间下面的SystemEvents类,他有一个静态的事件SessionEnding在系统注销或者关机时发生,此事件只有在winform的程序下有效,而在控制台程序下面无效,不能激发事件;还有一点我们必须在程序推出时将加上的事件移除掉,否则就容易造成内存溢出。

     

    关键代码如下:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;

    using Microsoft.Win32;

    namespace Shutdown
    {
        
    static class Program
        
    {
            
    /// <summary>
            
    /// 应用程序的主入口点。
            
    /// </summary>

            [STAThread]
            
    static void Main()
            
    {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(
    false);
                FormShutdown formShutdown 
    = new FormShutdown();
                SystemEvents.SessionEnding 
    += new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding);
                Application.Run(formShutdown);
            }


        }

    }
    Form 的代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.Win32;

    namespace Shutdown
    {
        
    public partial class FormShutdown : Form
        
    {
            
    const string MESSAGE_TXT = "您签退了吗?";
            
    const string MESSAGE_TITLE = "提示";

            
    public FormShutdown()
            
    {
                InitializeComponent();
            }



            
    internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
            
    {
                DialogResult result 
    = MessageBox.Show(MESSAGE_TXT, MESSAGE_TITLE, MessageBoxButtons.YesNo);

                e.Cancel 
    = (result == DialogResult.No);
            }


            
    private void FormShutdown_Load(object sender, EventArgs e)
            
    {
                
    this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 2000);
            }


            
    protected override void OnClosed(EventArgs e)
            
    {
                SystemEvents.SessionEnding 
    -= new SessionEndingEventHandler(this.SystemEvents_SessionEnding);
                
    base.OnClosed(e);
            }

        }

    }

    此程序在使用c#2.0在Windows2003下测试通过。大家在使用SystemEvents.SessionEnding事件时切记要在程序退出时移除事件。

    不过有两点遗憾之处:

    1.  使用这种方式不能捕获休眠时的事件

    2.  这个程序占用的内存太多了,只有这么一个小功能居然占了12M的内存,这都是.Net framework惹的货;实在是不可思议。

    大家有没有什么好主意可以克服这两个缺点呢?

    下载源文件

  • 相关阅读:
    Centos7升级gcc版本方法之一使用scl软件集
    JMeter的使用——ApacheJMeterTemporaryRootCA.crt的用法
    JavaWeb学习记录(十九)——开发JSTL自定义标签
    JavaWeb学习记录(二十二)——模式字符串与占位符
    JavaWeb学习记录(二十一)——国际化处理
    JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现
    JavaWeb学习记录(二十五)——权限管理总结
    JavaWeb学习记录(二十四)——获取插入数据后,自动生成的id值
    JavaWeb学习记录(二十七)——定时发送邮件ServletContextListener监听实现
    JavaWeb学习记录(二十三)——文件上传与下载
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/csharp_catch_shutdown_events.html
Copyright © 2011-2022 走看看