フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: モニター電源制御
sukesan
メンバー
投稿数: 2
モニター電源制御
on: 2014/03/17 11:44 Mon

モニターの電源制御で
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
で電源OFFしたのですが、マウスやキーボード操作で復帰してしまいます。
また、何か表示が変わっても復帰してしまいます。

下記のコマンドでのみ復帰させることはできないでしょうか?
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

他に何か方法がありましたらご教示下さい。
よろしくお願いします。

DEKO
管理者
投稿数: 2690
Re: モニター電源制御
on: 2014/03/18 12:41 Tue

うーん。できるかどうかは知りませんが、
例えばそのアプリケーションが実行されている時はメッセージをフックして、他のアプリに渡さないようにするとかですかね?
# ちょっぴり危険なアプリになりそうな気はしますが。

Mr.XRAY
メンバー
投稿数: 192
Re: モニター電源制御
on: 2014/03/26 06:13 Wed

やってみました.
マウスとキーのグローバルフックを使用しています.
一応,動作はしているみたいですが.何とも…

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 のメッセージを送信しています.

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.034 sec.