Q&A

  • 마우스와 키보드 감지하기...

메신져 기능중에 키보드나 마우스가 일정시간 사용되지 않으면

자동으로 자리비움으로 되고, 움직이면 다시 온라인으로 돌아옵니다.

시스템에서 마우스와 키보드가 움직였는지 감지하려면 어떻게 하면 되나요?

답변부탁드립니다~~

예제나 참고할만한 자료라도 구할 수 있을까요?
2  COMMENTS
  • Profile
    조규춘 2002.02.15 22:30


    여러가지 방법들이 있을수 있지만..

    가장 간단한 방법으로는 클라이언트에서 타이머 두개를 놓는거지요.~

    딸랑 타이머 이야기 하니깐 이상하실 텐데 만들수 있는 구조는

    화면보호기의 원리랑 똑같습니다.

    보통 화면보호기가 작동하고있는 도중에 사용자에 의한 키나

    마우스의 이동이 발생되면 화면보호기는 바루 종료를 하고 말지요~

    그리하여 다음에서 이러한 사실을 이용해서..


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls;

    type
    TForm1 = class(TForm)
       Timer1: TTimer;
       Timer2: TTimer;

       procedure Key_Mouse_Detect(var Msg: TMsg; var Handled:Boolean);
       procedure Timer1Timer(Sender: TObject);
       procedure FormCreate(Sender: TObject);
       procedure Timer2Timer(Sender: TObject);
    private
       { Private declarations }
    public
       { Public declarations }
    end;

    var
    Form1: TForm1;
    i : integer;

    implementation

    {$R *.dfm}

    { TForm1 }

    procedure TForm1.Key_Mouse_Detect(var Msg: TMsg; var Handled: Boolean);
    var
    firstmousePos : TPoint;
    begin
    // 마우스의 이동을 감지한다.
    if Msg.message = wm_Mousemove then
    begin
       // 마우스가 10 픽셀 이상의 이동이 있다면 타이머의 작동을 중지한다.
       if (Abs(loword (Msg.lParam)- firstmousePos.X ) > 10) or
          (Abs(Hiword (Msg.lParam)- firstmousePos.Y ) > 10) then
       begin
         timer1.Enabled := False;
       end;
    end
    else
    begin
       case Msg.message of
         WM_KEYDOWN      : timer1.Enabled := False;    // 키보드가 눌려졌을때
         WM_KEYUP        : timer1.Enabled := False;    // 키보다가 눌렸다가 올라갔을때
         WM_LBUTTONDOWN  : timer1.Enabled := False;    // 마우스의 왼쪽버튼이 눌렸을때
         WM_RBUTTONDOWN  : timer1.Enabled := False;    // 마우스의 오른쪽버튼이 눌렸을때
         WM_SYSKEYDOWN   : timer1.Enabled := False;    // 알트키나 컨트롤키같은게 눌렸을때
         WM_SYSKEYUP     : timer1.Enabled := False;    // 알트키나 컨트롤키같은게 눌렸다가 올라갔을떄
         WM_ACTIVATE     : timer1.Enabled := False;    // 가장 상위에 있는 윈도우가 비활성 메시지가 생길때
         WM_ACTIVATEAPP  : timer1.Enabled := False;    // 다른 윈도우 실행파일이 실행될때
       end;
    end;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Inc(i);
    caption := IntToStr(i);
    if i = 60 then
    begin
       ShowMessage('일분동안 아무론 키조작이나 마우스 조작이 없었군요');
    end;

    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin

    Application.OnMessage := Key_Mouse_Detect;
    end;

    procedure TForm1.Timer2Timer(Sender: TObject);
    begin
    if Timer1.Enabled = false then
    begin
       i := 0;
       Timer1.Enabled := true;
    end;
    end;

    end.


    좋은 하루 되셔요~
  • Profile
    윤도상 2002.02.16 00:00
    가르쳐 주신 방법을 하니까, 해당 폼이 활성화 되어있는 상태에서만

    작동이 되더라구요.

    그리고 마우스도 폼위에 있을때만 감지 되고,


    예를 들어, 폼이 띄워져 있고 마우스는 폼 밖에서 움직여도

    마우스가 움직이지 않은 것처럼 인식 하더라구요.

    폼이 활성화되지 않은 상태에서도 마우스나 키보드를 감지하려면

    어떻게 해야합니까?