仮想キーコードでスタンバイ機能を止めるには?

解決


?  2008-11-18 11:40:44  No: 32602

1秒おきに実行されるループの中で、

    keybd_event(Ord('A'), 0, 0, 0);
    keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0);

と記述しておけば、「スクリーンセーバー」「モニタの電源オフ」
「スタンバイ」の全てが機能しなくなる筈だ、と考えたのですが、
なぜかスタンバイ機能のみ動いてしまいます。
  自分の手でキーを叩けば当然スタンバイ機能も動かないのですが、
「仮想キーを叩くこと」で「手でキーを叩くこと」と全く同じ効果
を得ることは不可能なのでしょうか?


ん?  2008-11-18 18:33:38  No: 32603

スタンバイを無効にしたいなら、↓のURLにあるように、
OnPowerBroadcast で、拒否するのはだめなんでしょうか?
http://its55.blog4.fc2.com/blog-entry-66.html


?  2008-11-19 00:47:27  No: 32604

ん?さん返答ありがとうございます。
BROADCAST_QUERY_DENYによりスタンバイ機能を無効にする
方法については、過去にこの掲示板で教えていただいたこと
があり、その方法で解決してしまっても良いのですが、
スタンバイ機能のみ仮想キーを無視してしまうのがどうにも
腑に落ちないのです。
手でキーを叩くのと同じ筈なのですが、何か違っているのでしょうか?


D  2008-11-22 09:44:42  No: 32605

仮想キーについては分かりませんが。
「スクリーンセーバー」「モニタの電源オフ」「スタンバイ」を抑止したいのであれば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);
とします。


?  2008-11-22 21:41:04  No: 32606

Dさん返答ありがとうございます。
助言通りSetThreadExecutionStateを使うことで無事
「スクリーンセーバー」「モニタの電源オフ」「スタンバイ」
それぞれを止めることができました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加