퇴근5분전

 

  윈폼 만들때 일정 시간 입력이 없으면 뭔가 해야 할때... ( 화면 보호기, 로그아웃 같은... )

 

간단한 샘플코드이다.

 

 

5초간 가만히 두면 텍스트 박스가 잠긴다.

 

Idle 이벤트가 발생하면서 텍스트 박스에 시간(밀리초)이 표시된다.

 

단,  윈도우 전체 <--- 범위라서 ... 응용프로그램 밖에서 마우스나 키보드가 움직여도 값이 초기화 된다.

 

 오늘 이걸로 윈폼 로그인 세션을 구현하기는 했는데... 사용환경 덕분에 고려사항은 아니어서

 

우선 패스... 응용프로그램 범위내에서라면 다른 방법을 찾아봐야 될 것 같다.

 

 

 

 

public partial class Form1 : Form
    {
        [DllImport("User32.dll")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

        internal struct LASTINPUTINFO
        {
            public uint cbSize;
            public uint dwTime;
        }

        public static uint GetIdleTime()
        {
            LASTINPUTINFO LastUserAction = new LASTINPUTINFO();
            LastUserAction.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(LastUserAction);
            GetLastInputInfo(ref LastUserAction);
            return ((uint)Environment.TickCount - LastUserAction.dwTime);
        }

        TimeSpan limitSessionTime = new TimeSpan(0, 0, 5);
         
        public Form1()
        {
            InitializeComponent();
            Application.Idle += Application_Idle;
            isIdleReset = true;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            button1.PerformClick();
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            Application.Idle -= Application_Idle;
            base.OnFormClosed(e);
        }

        private void Application_Idle(object sender, EventArgs e)
        {
            textBox1.Text = "" + GetIdleTime();

            if (isIdleReset) return;

            if (!isIdleReset && limitSessionTime.TotalMilliseconds < GetIdleTime())
            {
                isIdleReset = true;
                this.textBox1.ReadOnly = true;
                Application.DoEvents();
            }
        }

        bool isIdleReset = true;
        private void button1_Click(object sender, EventArgs e)
        {
            isIdleReset = false;
            this.textBox1.ReadOnly = false;
            Application.RaiseIdle(e);
        }
    }