c# 防早退提醒器
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="WorkingStartTime" value="8:30" /> <add key="WorkingEndTime" value="17:30" /> <add key="WorkingHours" value="8" /> <add key="TotalRestHours" value="1" /> </appSettings> </configuration>
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using Microsoft.VisualBasic; using System.IO; using System.Diagnostics; using System.Configuration; using Microsoft.Win32; namespace WorkAssistant { public partial class frmMain : Form { [DllImport("kernel32.dll", CharSet = CharSet.Ansi)] private static extern IntPtr SetProcessShutdownParameters(int dwLevel, int dwFlags); private DateTime StartTime { get; set; } private DateTime WorkingStartTime { get; set; } private DateTime WorkingEndTime { get; set; } private bool ShutdownFlag { get; set; } public int WorkingHours { get; set; } public int TotalRestHours { get; set; } public frmMain() { InitializeComponent(); this.WorkingHours = 8; this.TotalRestHours = 1; } void frmMain_FormClosing(object sender, FormClosingEventArgs e) { throw new NotImplementedException(); } protected override void OnShown(EventArgs e) { base.OnShown(e); this.Hide(); } protected override void WndProc(ref Message m) { const int WM_QUERYENDSESSION = 0x011; const int WM_ENDSESSION = 0x16; var reason = SessionEndReasons.SystemShutdown; if (ShutdownFlag) { base.WndProc(ref m); return; } if (m.Msg == WM_QUERYENDSESSION) { return; } else if (m.Msg == WM_ENDSESSION) { if (m.LParam.ToInt32() == 0) { reason = SessionEndReasons.SystemShutdown; } else { reason = SessionEndReasons.Logoff; } var workOffTime = WorkingEndTime; if (StartTime > WorkingStartTime) { workOffTime = StartTime.AddHours(WorkingHours).AddHours(TotalRestHours); } if (workOffTime < WorkingEndTime) { workOffTime = WorkingEndTime; } if (DateTime.Now < workOffTime) { var msgResult = MessageBox.Show(string.Format("今天的开机时间是:{0},应该在{1}下班,工时还不足{2}小时,确定现在关机吗?", StartTime, workOffTime, WorkingHours), "关机确认", MessageBoxButtons.YesNo); if (msgResult == System.Windows.Forms.DialogResult.Yes) { msgResult = MessageBox.Show(string.Format("今天的开机时间是:{0},应该在{1}下班,工时还不足{2}小时,确定现在关机吗?", StartTime, workOffTime, WorkingHours), "再次确认", MessageBoxButtons.YesNo); if (msgResult != System.Windows.Forms.DialogResult.Yes) { return; } } else { return; } } ShutdownFlag = true; base.WndProc(ref m); switch (reason) { case SessionEndReasons.SystemShutdown: Shutdown(); break; case SessionEndReasons.Logoff: Logoff(); break; default: Shutdown(); break; } } else { base.WndProc(ref m); } } private void Form1_Load(object sender, EventArgs e) { IntPtr result = SetProcessShutdownParameters(0x4FF, 0); if (result.ToInt32() == 0) { //failed to set shutdown sequence } StartTime = GetStartTime(); WorkingStartTime = Convert.ToDateTime(ConfigurationManager.AppSettings["WorkingStartTime"]); WorkingEndTime = Convert.ToDateTime(ConfigurationManager.AppSettings["WorkingEndTime"]); WorkingHours = Convert.ToInt32(ConfigurationManager.AppSettings["WorkingHours"]); TotalRestHours = Convert.ToInt32(ConfigurationManager.AppSettings["TotalRestHours"]); } public DateTime GetStartTime() { EventLog eventLog = new EventLog("system", "."); var startTime = eventLog.Entries.Cast<EventLogEntry>() .Where(item => item.TimeWritten > DateTime.Today) .Min(item => item.TimeWritten); return startTime; } public void Shutdown() { SystemManager.WindowsController.ExitWindows(SystemManager.RestartOptions.ShutDown, false); } public void Logoff() { SystemManager.WindowsController.ExitWindows(SystemManager.RestartOptions.LogOff, false); } } }
原创,比较简单,关机的代码请参考的另一篇随笔,代码是一模一样的。
桂棹兮兰桨,击空明兮溯流光。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战