ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴퓨터 사용여부( 자리비움 ) 파악하는 방법
    Programming/WINAPI 2008. 1. 8. 22:39

    네이트온이나 MSN메신저에서 일정시간동안 사용자가 컴퓨터를 사용하지 않으면..
    자리비움이나 부재중으로 상태가 변경이 됩니다.

    이러한 기능을 이용한 프로그램으로는 스크린세이버가 제일 대표적이죠..

    아무튼 사용자가 컴퓨터를 사용하고 있는지을 어떻게 파악을 할까?

    일단 컴퓨터를 사용한다는건 입력장치(마우스 나 키보드 등)을 사용하고 있다는것이겠죠..

    물론 영화감상같은 경우는 예외이긴하지만..

    위와 같은 상황은 제외하고 입력장치의 사용여부를 통해서 컴퓨터가 사용중인지를 파악하는게 제일 좋은 방법이겠죠..

    마우스와 키보드의 상태를 파악하기위해서는 후킹을 하는 방법이 아주 자세하게 상태를 파악할 수 있지만..

    dll을 따로 만들어야한다는게 번거롭죠..

    그래서 간단하게 마우스 좌표를 파악하는 함수인 GetCursorPos()와 키보드의 상태를 파악하는
    GetAsyncKeyState() 함수를 사용하여 컴퓨터 사용여부를 파악합니다.


    #include <stdio.h>
    #include
    <windows.h>
    static unsigned int KEYS[] =
            {VK_ESCAPE, // ESC
              VK_RETURN,
    // 엔터
              VK_SPACE,
              VK_SHIFT,
              VK_CONTROL,
              VK_LBUTTON,
    // 마우스 왼쪽버튼
              VK_RBUTTON 
    // 마우스 오른쪽버튼
             };

    POINT g_prevPos={0,};     // 마우스 좌표

    BOOL IsKeyPressed();     // 키보드를 사용하였는가?
    BOOL IsMouseMoved();   // 마우스를 사용하였는가?


    void main()
    {
         IsKeyPresed();
         IsMouseMoved();

         while(1)
         {
              Sleep(60000);     // 1분 단위로 체크
              if(IsKeyPressed() || IsMouseMoved())
              {
                   puts("사용중");
              }
              else
              {
                   puts("자리비움");
              }          
         }
    }
    BOOL IsKeyPressed()
    {
          UINT size = 0;
          UINT index = 0;
          size = sizeof(KEYS)/sizeof(UINT);     // VK키 갯수

          for(index=0; index < size; index++)
          {
                // 0이 아니면 현재 눌려져 있거나 눌린적이 있다는 것을 나타냄
                if(GetAsyncKeyState(KEYS[index])!=0)   
                      return TRUE;
          }
          return FALSE;
    }


    BOOL IsMouseMoved()
    {
          POINT curPos={0,};
          BOOL isMoved=FALSE;

          ::GetCursorPos(&curPos);
          isMoved = ((curPos.x == m_prevPos.x) && (curPos.y == m_prevPos.y)) ? FALSE:TRUE;
          g_prevPos = curPos;
          return isMoved;
    }

    위 코드 내용을 살펴보면 키보드의 상태를 파악하는 IsKeyPressed 에서는 KEYS배열에 정의된 VK(버추얼키라고 하는데 키보드상에 일반적은 문자들을 제외한 대부분의 키들이 버추얼키라고 대충보시면 됩니다.)들의 상태를
    GetAsyncKeyState라는 함수를 통해서 파악합니다.

    자세한 설명은 넘어가고 GetAsyncKeyState에 상태를 알고자하는 버추얼키값을 집어넣으면
    사용중이나가 사용된적이 없으면(눌린적이 없으면) 0값이 리턴됩니다.
    여기서 사용된적이라는 건 GetAsyncKeyState호출하고 나서 다시 호출한 기간동안에 사용된적이 있느냐를 말하는 것입니다.

    일단 많이 사용한다고 생각되는 키들의 상태를 파악하여 키보드 사용여부를 확인했습니다.

    그리고 마우스의 사용여부는 마우스가 이동했으면 사용한것으로 보고..
    마우스 현재의 위치와 이전의 위치를 비교해서 일치하지 않으면 사용한 것으로 판단을 합니다.

    그래서 1분단위로 키보드와 마우스상태로 컴퓨터 사용여부를 계속 파악하여 결과를 출력하는 내용입니다.








     

Designed by Tistory.