使用c#捕获windows的关机事件

摘要:
我该怎么办?我想知道我是否可以捕获Windows的关闭事件,并创建一个程序在它关闭时提醒我。我很幸运地很容易找到了Microsoft。Win32命名空间下的SystemEvents类有一个静态事件SessionEnding,该事件在系统注销或关闭时发生。此事件仅在winform程序下有效,但在控制台程序下无效,无法激发事件;另一点是,我们必须在程序启动时删除添加的事件,否则很容易导致内存溢出。关键代码如下:使用系统;使用System.Collections.Generic;使用System.Windows.Forms;使用Microsoft。Win32;namespaceShutdown{static classProgram{/*/////<summary˃////应用程序的主要入口点。使用SystemEvents.SessionEnding事件时,请记住在程序退出时删除事件。

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

 

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

 

关键代码如下:

使用c#捕获windows的关机事件第1张using System;
使用c#捕获windows的关机事件第1张
using System.Collections.Generic;
使用c#捕获windows的关机事件第1张
using System.Windows.Forms;
使用c#捕获windows的关机事件第1张
使用c#捕获windows的关机事件第1张
using Microsoft.Win32;
使用c#捕获windows的关机事件第1张
使用c#捕获windows的关机事件第1张
namespace Shutdown
使用c#捕获windows的关机事件第8张使用c#捕获windows的关机事件第9张
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张    
static class Program
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张    
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
/**//// <summary>
使用c#捕获windows的关机事件第11张        
/// 应用程序的主入口点。
使用c#捕获windows的关机事件第18张        
/// </summary>

使用c#捕获windows的关机事件第11张        [STAThread]
使用c#捕获windows的关机事件第11张        
static void Main()
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张            Application.EnableVisualStyles();
使用c#捕获windows的关机事件第11张            Application.SetCompatibleTextRenderingDefault(
false);
使用c#捕获windows的关机事件第11张            FormShutdown formShutdown 
= new FormShutdown();
使用c#捕获windows的关机事件第11张            SystemEvents.SessionEnding 
+= new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding);
使用c#捕获windows的关机事件第11张            Application.Run(formShutdown);
使用c#捕获windows的关机事件第18张        }

使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第18张    }

使用c#捕获windows的关机事件第32张}
Form 的代码:
使用c#捕获windows的关机事件第1张using System;
使用c#捕获windows的关机事件第1张
using System.Collections.Generic;
使用c#捕获windows的关机事件第1张
using System.ComponentModel;
使用c#捕获windows的关机事件第1张
using System.Data;
使用c#捕获windows的关机事件第1张
using System.Drawing;
使用c#捕获windows的关机事件第1张
using System.Text;
使用c#捕获windows的关机事件第1张
using System.Windows.Forms;
使用c#捕获windows的关机事件第1张
using Microsoft.Win32;
使用c#捕获windows的关机事件第1张
使用c#捕获windows的关机事件第1张
namespace Shutdown
使用c#捕获windows的关机事件第8张使用c#捕获windows的关机事件第9张
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张    
public partial class FormShutdown : Form
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张    
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张        
const string MESSAGE_TXT = "您签退了吗?";
使用c#捕获windows的关机事件第11张        
const string MESSAGE_TITLE = "提示";
使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张        
public FormShutdown()
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张            InitializeComponent();
使用c#捕获windows的关机事件第18张        }

使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张        
internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张            DialogResult result 
= MessageBox.Show(MESSAGE_TXT, MESSAGE_TITLE, MessageBoxButtons.YesNo);
使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张            e.Cancel 
= (result == DialogResult.No);
使用c#捕获windows的关机事件第18张        }

使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张        
private void FormShutdown_Load(object sender, EventArgs e)
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张            
this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 2000);
使用c#捕获windows的关机事件第18张        }

使用c#捕获windows的关机事件第11张
使用c#捕获windows的关机事件第11张        
protected override void OnClosed(EventArgs e)
使用c#捕获windows的关机事件第12张使用c#捕获windows的关机事件第13张        
使用c#捕获windows的关机事件第10张{
使用c#捕获windows的关机事件第11张            SystemEvents.SessionEnding 
-= new SessionEndingEventHandler(this.SystemEvents_SessionEnding);
使用c#捕获windows的关机事件第11张            
base.OnClosed(e);
使用c#捕获windows的关机事件第18张        }

使用c#捕获windows的关机事件第18张    }

使用c#捕获windows的关机事件第32张}

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

不过有两点遗憾之处:

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

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

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

下载源文件

免责声明:文章转载自《使用c#捕获windows的关机事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JS实现“隐藏与显示”功能(多种方法)UniAPP IAP支付流程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pyqt 窗口的调用

关于Pyqt窗口调用的格式 正常设计两个ui文件 正常Pyuic转成.py 在唯一的 run.py 函数里这样写即可实现窗口调用 import ... from Timer2 import Ui_Form # Timer2为主ui对于py文件的名字 from TimerSetup import Ui_Form as UISetup # Timer...

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具,使用Qt Designer可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 本文主要内容1、Qt Designer程序主界面窗口介绍。 2、Qt Designer程序实现界面...

表单操作

引言:JavaScript最早被设计出来就是为了实现对注册表单的验证,本文简单的介绍了JavaScript的表单操作 1.获取表单对象的方法 1.通过表单ID获取:document.getElementById("formId"); 2.通过表单的索引获取:document.forms[index];3.通过表单的name获取:document.forms...

Android 关机弹出菜单

特别推荐: 移动资讯——<<我是开发者>>个人专访 关于android远程登录源码解析 Android源码之热血足球+PPT讲解 在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。这些功能对于手机非常适用,但是对于机顶盒产品就没有什么必要了。本文简单介绍一下怎样定制关机界面。  ...

VUE Flask登录的初探-JWT的探索

上回简单实现了基于JWT的登录,并且留下了一些问题,jwt天生的弊端。本次用某些逻辑解决jwt的弊端 先列举jwt可能遇到的问题: 1.注销问题,当客户端注销登录后,token在有效期内依然有效,实际上从服务端无法让token失效2.修改密码,当用户修改了密码,按常规需要让前次token失效。3.续签问题,jwt虽然有超时机制,但没有实现自动续签。 为了解...

Jfinal文件上传

前端样式,代码 前端函数 在前端对所要上传的文件进行类型和大小的校验,然后走initUploadForm();方法进行后台上传 html注意事项 form表单要加<form name="myform" method="post"enctype="multipart/form-data"> 后台controller,并在数据库记录上传...