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

解決


?  2008-11-18 02:40:44  No: 32602  IP: 192.*.*.*

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

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

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

編集 削除
ん?  2008-11-18 09:33:38  No: 32603  IP: 192.*.*.*

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

編集 削除
?  2008-11-18 15:47:27  No: 32604  IP: 192.*.*.*

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

編集 削除
D  2008-11-22 00:44:42  No: 32605  IP: 192.*.*.*

仮想キーについては分かりませんが。
「スクリーンセーバー」「モニタの電源オフ」「スタンバイ」を抑止したいのであれば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 12:41:04  No: 32606  IP: 192.*.*.*

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

編集 削除