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;
여러가지 방법들이 있을수 있지만..
가장 간단한 방법으로는 클라이언트에서 타이머 두개를 놓는거지요.~
딸랑 타이머 이야기 하니깐 이상하실 텐데 만들수 있는 구조는
화면보호기의 원리랑 똑같습니다.
보통 화면보호기가 작동하고있는 도중에 사용자에 의한 키나
마우스의 이동이 발생되면 화면보호기는 바루 종료를 하고 말지요~
그리하여 다음에서 이러한 사실을 이용해서..
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.
좋은 하루 되셔요~