このサンプルではボタンをクリックしてポーリングを開始した後でユーザ入力(キーボード、マウス操作)が10秒間発生しなかったときにメッセージダイアログを表示します。またポーリング毎に前回からユーザ入力が発生していない場合はLabel1に表示しているGetTickCountの表示をclRedに変更しています。
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := True; Button1.Enabled := False; FLastTick := 0; Timer1Timer(Sender); end; procedure TForm1.Timer1Timer(Sender: TObject); var LII: TLastInputInfo; begin FillChar(LII,SizeOf(LII),0); LII.cbSize := SizeOf(LII); if GetLastInputInfo(LII) = False then begin Exit; end; Label1.Caption := 'Last user input: ' + IntToStr(LII.dwTime); if FLastTick <> LII.dwTime then begin Label1.Font.Color := clWindowText; FLastTick := LII.dwTime; end else begin Label1.Font.Color := clRed; end; if (GetTickCount - LII.dwTime) > (10 * MSecsPerSec) then begin Timer1.Enabled := False; Button1.Enabled := True; MessageDlg('Detect for input idle (10 seconds).', mtInformation,[mbOk],0); Label1.Caption := ''; end; end;
別解としてSetWindowsHookEx(ja)にWH_KEYBOARD_LL(ja)/WH_MOUSE_LL(ja)を指定して低レベルフックをかけ、フック関数内でGetTickCountの値を取得、というものも考えられますが、
- DelphiのIDEから実行するとデバッガでブレークしたときにやたらに時間がかかる。
- Windows XPのVisual Style(Luna)とマウスの低レベルフックの相性が悪く(どちらかというとLunaの不具合)、フォームの最小化、最大化ボタンをクリックしたときに極端に反応が悪くなる。
0 件のコメント:
コメントを投稿