문제

일부 배경 : 여러 형태의 응용 프로그램을 작성하고 있습니다. 사용자는 대부분의 기능을 사용하려면 로그인해야하며 지금까지 제대로 작동했습니다. 그러나 이제 클라이언트는 일정량의 비활성 시간 후에 사용자가 로그 아웃하도록 요청했습니다. 문제는 사용자가 내 응용 프로그램이 아닌 컴퓨터에서 여전히 활성화 될 수 있다는 것입니다. 분명히, 나는 여전히 데스크탑과 상호 작용하는 경우에도 응용 프로그램에서 비활성화 될 때 사용자를 로그 아웃해야합니다.

먼저 나는 이것이 상당히 간단 할 것이라고 생각했다. 마지막 작업의 시간을 기억하고 현재 시간과 타이머로 지속적으로 비교하고 통과 된 시간이 허용 시간보다 큰 경우 사용자를 로그 아웃하십시오. 그러나 마지막 액션 시간을 찾는 것이 그렇게 간단하지 않다는 것을 깨달았습니다 ...

물론 나는 같은 것을 붙여 넣을 수 있습니다

Program.LastActionTime = DateTime.Now;

모든 onchange, onclick 등, 이벤트에서 ... 그러나 이것은 응용 프로그램의 크기로 인해 많은 양의 작업 일뿐 만 아니라 ... 그것은 또한 매우 나쁜 연습 일 것이며 그것이 될 것이라고 확신합니다. 적어도 한 번은 잊어 버렸습니다. 모든 것을 신뢰할 수 없게 만들었습니다.

더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

프로그램 .CS 파일에서 application.idle 이벤트를 처리하고 타이머를 재설정 할 수 있습니다. 보다:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.idle.aspx

다른 팁

내가 과거에 사용한 한 가지 방법은 MessageFilter 신청서에서 사용자 활동을 나타내는 특정 유형의 이벤트를 확인하십시오.

 public class UserActivityFilter : IMessageFilter
 {
        // Define WinAPI window message values (see pinvoke.net)
        private int WM_LBUTTONDOWN = 0x0201;
        private int WM_MBUTTONDOWN = 0x0207;
        private int WM_RBUTTONDOWN = 0x0204;
        private int WM_MOUSEWHEEL = 0x020A;
        private int WM_MOUSEMOVE = 0x0200;
        private int WM_KEYDOWN = 0x0100;

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN)
            {
                //User activity has occurred
                // Reset a flag / timer etc.
            }
            return false;
        }
  }

그런 다음 run ()을 호출하기 전에 양식의 메인 () 메소드에서 :

Application.AddMessageFilter(new UserActivityFilter());

복잡한 메시지 필터를 추가하거나 여러 개의 별도 필터를 추가하면 응용 프로그램의 응답 성이 느려질 수 있습니다.

당신은 무시할 수 있습니다 WndProc, 업데이트 Program.LastActionTime 각 관련 Keyboard/Mouse 이벤트 메시지.

MouseMove 및 KeyPressed 이벤트에 이벤트 핸들러를 연결 한 다음 해당 이벤트 내부의 초점을 확인하십시오.

일반적 으로이 정보를 원시 사용자 입력 대신 애플리케이션 로직에서 도출하는 것이 가장 좋은 아이디어이지만 유연한 인프라가 없다고 가정합니다 (아마도 명령 패턴)이 정보를 제공 할 수 있습니다.

그래서 나는 당신의 주요 양식에 핸들러를 등록하는 것이 좋습니다 - 클릭 또는 주요 이벤트를받는 경우 (활성화 form.keypreview 이를 위해), 사용자가 활성화되어 비활성 시간을 재설정 할 수 있습니다.

모든 창 양식이 상속하는 기본 클래스를 만들 수 있습니다. 기본 클래스에서는 모든 Keypress 또는 클릭에서 타임 아웃을 확인하고 재설정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top