掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
モニタ電源の入り切り制御の方法は? (ID:32084)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Windowsメッセージを奪っても今度は再度1分後に自動で電源をOFFするのが 困難なようです。 kernel32.dll内のSetThreadExecutionStateを呼ぶのが最も理想の動作で あったため、作成してみました。 kernel32.dllが無いと起動すらしなくなるのが嫌なので 動的DLLで呼び出していますが 実際はたった1命令で済ませる事もできそうです。 自己解決してしまいましたが、様々な助言を頂いた事、感謝いたします。 // SetThreadExecutionState APIの引数 const ES_CONTINUOUS = $80000000; ES_SYSTEM_REQUIRED = $00000001; ES_DISPLAY_REQUIRED = $00000002; type TSetThreadExecutionState = function(esFlags: DWORD): DWORD; stdcall; type TScreenSaverCtrl = class(TPersistent) private { Private 宣言 } FDllHandle : THandle; // 動的ロードしたDLLのハンドル FExecutionState : TSetThreadExecutionState; public { Public 宣言 } constructor Create; destructor Destroy;override; // 画面の表示が必要な場合の処理 function Require() : Boolean; end; implementation { TScreenSaverCtrl } constructor TScreenSaverCtrl.Create; begin FDllHandle := LoadLibrary('kernel32.dll'); // DLLを動的ロード if FDllHandle = 0 then begin // 失敗した場合 // 必要であればエラー処理 raise Exception.Create('kernel32.DLL が見つかりません'); // エラーとして通知 exit; end; @FExecutionState := GetProcAddress(FDllHandle,'SetThreadExecutionState'); if @FExecutionState = nil then begin // 必要であればエラー処理 //raise Exception.Create('SetThreadExecutionState' + ' が見つかりません'); exit; end; end; destructor TScreenSaverCtrl.Destroy; begin if FDllHandle <> 0 then begin FreeLibrary(FDllHandle); end; inherited; end; function TScreenSaverCtrl.Require: Boolean; begin result := False; if @FExecutionState = nil then exit; FExecutionState(ES_DISPLAY_REQUIRED); result := True; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.