1秒おきに実行されるループの中で、
keybd_event(Ord('A'), 0, 0, 0);
keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0);
と記述しておけば、「スクリーンセーバー」「モニタの電源オフ」
「スタンバイ」の全てが機能しなくなる筈だ、と考えたのですが、
なぜかスタンバイ機能のみ動いてしまいます。
自分の手でキーを叩けば当然スタンバイ機能も動かないのですが、
「仮想キーを叩くこと」で「手でキーを叩くこと」と全く同じ効果
を得ることは不可能なのでしょうか?
スタンバイを無効にしたいなら、↓のURLにあるように、
OnPowerBroadcast で、拒否するのはだめなんでしょうか?
http://its55.blog4.fc2.com/blog-entry-66.html
ん?さん返答ありがとうございます。
BROADCAST_QUERY_DENYによりスタンバイ機能を無効にする
方法については、過去にこの掲示板で教えていただいたこと
があり、その方法で解決してしまっても良いのですが、
スタンバイ機能のみ仮想キーを無視してしまうのがどうにも
腑に落ちないのです。
手でキーを叩くのと同じ筈なのですが、何か違っているのでしょうか?
仮想キーについては分かりませんが。
「スクリーンセーバー」「モニタの電源オフ」「スタンバイ」を抑止したいのであればSetThreadExecutionStateを使う方法もあります。
function SetThreadExecutionState(esFlags: DWORD): DWORD; stdcall external 'kernel32.dll';
const
ES_SYSTEM_REQUIRED = $00000001;
ES_DISPLAY_REQUIRED = $00000002;
ES_CONTINUOUS = $80000000;
という宣言をしておいてから、
「スクリーンセーバー」「モニタの電源オフ」を抑止する場合はタイマーなどで
SetThreadExecutionState(ES_DISPLAY_REQUIRED);
を定期的に呼び出します。
「スタンバイ」を抑止するには、
SetThreadExecutionState(ES_SYSTEM_REQUIRED or ES_CONTINUOUS);
と一度呼び出すだけでOKです。定期的に呼び出す必要はありません。
キャンセルするには
SetThreadExecutionState(ES_CONTINUOUS);
とします。
Dさん返答ありがとうございます。
助言通りSetThreadExecutionStateを使うことで無事
「スクリーンセーバー」「モニタの電源オフ」「スタンバイ」
それぞれを止めることができました。
ありがとうございました。
ツイート | ![]() |