看範例學C#-29 閒置過久自動關閉畫面

  • 9490
  • 0
  • C#
  • 2011-10-07

看範例學C#-29 閒置過久自動關閉畫面

本例使用windows api去偵測滑鼠及鍵盤是否有在動作,透過程式設定閒置秒數,當時間到就關閉畫面

當鍵盤滑鼠 再有動作,畫面就會自動恢復

以下為本例程始碼


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;
namespace ex29
{
    public partial class Form1 : Form
    {
        public int Idle_time = 0;
        public enum MonitorState : int
        {
            MONITOR_ON = -1,
            MONITOR_OFF = 2,
            MONITOR_STANBY = 1
        } ;
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 調用windows API獲取鼠標鍵盤空閒時間
        /// </summary>
        /// <param name="plii"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
        /// <summary>
        /// 獲取鼠標鍵盤空閒時間
        /// </summary>
        /// <returns></returns>
        public static long GetIdleTick()
        {
            LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
            lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
            if (!GetLastInputInfo(ref lastInputInfo)) return 0;
            return Environment.TickCount - (long)lastInputInfo.dwTime;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct LASTINPUTINFO
        {
            [MarshalAs(UnmanagedType.U4)]
            public int cbSize;
            [MarshalAs(UnmanagedType.U4)]
            public uint dwTime;
        }
        public int WM_SYSCOMMAND = 0x0112;
        public int SC_MONITORPOWER = 0xF170;
        [DllImport("user32.dll")]
        private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (GetIdleTick() / 1000 >= Idle_time)//閒置??秒
            {
                SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, (int)MonitorState.MONITOR_OFF);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                int.TryParse(textBox1.Text, out Idle_time);
                timer1.Interval = Idle_time * 1000;//設定計時器幾毫秒執行一次
                timer1.Enabled = true;//打開器
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

29

ex29.rar


如有錯誤 歡迎指正