やってみました.
マウスとキーのグローバルフックを使用しています.
一応,動作はしているみたいですが.何とも…
implementation
uses MMSystem;
{$R *.dfm}
var KeyHookHandle : HHOOK; MouseHookHandle : HHOOK;
//----------------------------------------------------------------------------- // マウスフックのコールバック関数 //----------------------------------------------------------------------------- function LowLevelMouseProc(Code:integer; wPar:wParam; lPar:LParam): Integer; stdcall; begin if Code < 0 then begin Result := CallNextHookEx(MouseHookHandle, Code, wPar, lPar); exit; end;
if Code = HC_ACTION then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2); Result := -1; end else begin Result := CallNextHookEx(MouseHookHandle, Code, wPar, lPar); end; end;
//----------------------------------------------------------------------------- // キーフックのコールバック関数 //----------------------------------------------------------------------------- function LowLevelKeyProc(Code:integer; wPar:wParam; lPar:LParam): Integer; stdcall; begin if Code < 0 then begin Result := CallNextHookEx(KeyHookHandle, Code, wPar, lPar); exit; end;
if Code = HC_ACTION then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2); Result := -1; end else begin Result := CallNextHookEx(KeyHookHandle, Code, wPar, lPar); end; end;
//============================================================================= // 一定時間,モニタの電源をOFFにする // 動作確認 Windows 7 U64(SP1) + Delphi XE Pro //============================================================================= procedure TForm1.Button1Click(Sender: TObject); var StrarTime : Cardinal; begin Panel1.Caption := ''; Panel1.Update;
//モニタの電源をOFF SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
//マウスとキーのグローバルフック開始 if MouseHookHandle = 0 then MouseHookHandle := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0); if KeyHookHandle = 0 then KeyHookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyProc, hInstance, 0);
//テスト用の待ち時間 StrarTime := timeGetTime; while True do begin if (timeGetTime - StrarTime) >= 7000 then break; Application.ProcessMessages; Sleep(1); end; //マウスとキーのグローバルフック解除 if MouseHookHandle <> 0 then UnhookWindowsHookEx(MouseHookHandle); if KeyHookHandle <> 0 then UnhookWindowsHookEx(KeyHookHandle); MouseHookHandle := 0; KeyHookHandle := 0;
//モニタの電源をON SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
Panel1.Caption := 'END'; end;
end.
フックのコールバック関数の弟 1 引数の値か HC_ACTION の時の戻り値を負の値にすると,他のアプリにマウスとキーのメッセージを送信しなうようにできます.
しかし,システム,つまり OS 自体に受信させないようにすることはできないようです.
そこで,コールバック関数の中で,マウスとキーの操作を検知したら,電源 OFF のメッセージを送信しています.
|