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惹的货;实在是不可思议。

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

    下载源文件

  • 相关阅读:
    HOJ 2139 Spiderman's workout(动态规划)
    FZU 2107 Hua Rong Dao(dfs)
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/csharp_catch_shutdown_events.html
Copyright © 2011-2022 走看看