C# 实现假关机

使用本代码,你可以实现在点下Windows关机键后,屏幕关闭,鼠标键盘暂时不能唤醒屏幕,让人以为已经关闭了电脑!
时间所限,仅列出关键代码,你可以在此基础上添加上显示假的关机屏幕,以实现以假乱真效果!

导入Win32 API三个函数

        [DllImport("kernel32.dll")]
        static extern bool SetProcessShutdownParameters(uint dwLevel, uint dwFlags); // 设置进程相对于其它进程的关闭优先级
        [DllImport("user32.dll")]
        static extern bool BlockInput(bool fBlockIt); // 禁用键盘鼠标
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); //用于发送关闭显示器消息
        const UInt32 WM_SYSCOMMAND = 0x0112;
        const UInt32 SC_MONITORPOWER = 0xF170;

下面是主要代码

        public FormMain()
        {
            InitializeComponent();
            Microsoft.Win32.SystemEvents.SessionEnding += SessionEndingEvent;
 
            SetProcessShutdownParameters(0x480, 0);
        }
 
        ~FormMain()
        {
            Microsoft.Win32.SystemEvents.SessionEnding -= SessionEndingEvent;
        }
 
        private void SessionEndingEvent(object sender, SessionEndingEventArgs e)
        {
            SessionEndReasons endReasons = e.Reason;
            BlockInput(true);
            SendMessage(this.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2);
            e.Cancel = true;
        }

注意:Microsoft.Win32.SystemEvents.SessionEnding事件需要在Form窗体下才有效,不然这么简单的程序我还是习惯写成控制台的。程序在接收到系统关机信息后,先用BlockInput切断键盘鼠标输入,然后关闭显示器。SetProcessShutdownParameters的目的是保证次程序最先收到关机消息。

如何恢复输入?MSDN说 Presse CTRL+ALT+DEL!

Win7 下是阻止不了关机的!Win7下可以参考这个 《用hook实现win7下假关机》

转载注明:http://www.shenyaocn.com/c-实现假关机/