퇴근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);
        }
    }

Comment +0

 

 음... DB관련 툴을 만들어보다가 판넬에 스크롤이 있을때  작은 미리보기 창이 뜨면 괜찮겠다 싶어서...

보통의 다른 프로그램들은 있으니까...

 

한번 만들어보자 싶어 구현해봤다. 퇴근해서 2시간정도씩 해서 5시간정도 해본것 같은데...

 

쉽게생각했는데... 이상하게 끝이 안맞아서... 예외처리로 끝을 맞췄다.

 

 

 현재 스크롤을 따라서 우측에 작은 박스가 이동하게 되어있다.

우측 판넬 배경은 나중에 왼쪽 판넬 배경을 캡쳐해서 배치하면 좀 더 그럴듯 하게 만들수 있겠다.

 

음... 이런 잔 기술들을 따로 모아서 영상을 만들어볼까나... 문득.. 떠올랐다.

 

[ 소스는 첨부로 숨김 ]

 

Comment +0

 

 

질문글...

http://www.hoons.net/Board/QACSHAP/Content/103574

 

풀이... 엄청 쉬운건데...

 

두가지 방법으로 해결해봄...

 

 

         ## 질문 글처럼 join으로 하고자 하면...

            string a = "2019021109462";
            int idx = 0;
            int splitLength = 4;
            List<string> lst = new List<string>();
            for (idx = 0; idx < a.Length;)
            {
                if (a.Length < (idx + splitLength))
                {
                    splitLength = (idx + splitLength) - a.Length;
                }

                lst.Add(a.Substring(idx, splitLength));
                idx += splitLength;
                splitLength = 2;
            }

 

         ## 질문 글처럼 split 으로 잘라서 처리하고자 하면..

            idx = 0; splitLength = 4;
            for (idx = 0; idx < a.Length;)
            {
                if (a.Length < (idx + splitLength))
                {
                    splitLength = (idx + splitLength) - a.Length;
                }
                a = a.Insert(idx + splitLength, " ");
                idx += splitLength + 1;
                splitLength = 2;               
            }

 

   질문글에서 딱히 split이랑 join을 이용한다고 하는데...

  음... 두 방법만 으로 풀려면... 답이 떠오르지 않는다.

 

 우선 원래의 대상 값을 내가 이용가능한 메서드의 기능에 적용할수 있는 값으로 우선 변환을 거친 후...

라면 쉽게 가능할텐데....

 

 질문글에 맞는 답은 아닌것 같다.

 

그래도 출근전에 병원들렀다 가야해서... 잠깐 풀어본다.

 

질문 하나더...

 

http://www.hoons.net/Board/QACSHAP/Content/103584

 

음... 간만에 정규식..


            string str = "(.)update(10123123123)googleapis(3.0)com(0)";

            Regex rex = new Regex(@"\((\d|\.|)+\)");
            string xx = rex.Replace(str, ".").Trim('.');

 

일단 내용에 대한 건 처리는 된것 같은데 예외가 생길수도 있겠네

 

 

 

 

Comment +0