- 締切済み
モニタの電源がオフであるかどうか(Windows)
マウス・キーボード操作が指定時間なければ、モニタ(ビデオカード出力)をオフにするソフトを作っています。 (ゲームや動画鑑賞中でも強制的に) モニタをオフにするときに以下を実行しています。 PostMessage(-1, 274, 61808, 2) 現在マウスの座標を前回取得した値と比較して、変わっていたらカウントをリセットします。 またはGetAsyncKeyStateで押されたキーがあったらリセットします。 キーの方は、ときどき見知らぬキー番号が押されっぱなしになったりと困っているのですが、今回はこちらは置いておいておきます。 マウス座標は1秒間隔でチェックしているので、1秒以内に動いて元の位置に戻ってしまったとき、モニタのオフは解除されるのにもかかわらず、カウントをリセットできません。 かといって、これ以上間隔を狭めてバックグラウンド動作が重くなるのも困ります。 そこで、モニタオフのカウントに到達した以降、数分ごとにPostMessageを送り続けるということをやって、何らかの原因でモニタがウェイクアップしても、定期的に再度モニタをオフにするようなことをやっています。 また、キーでもマウスでもなく、別のアプリケーションがウェイクアップしてしまうこともあるようで、マウスチェック間隔やキー押しっぱなし問題が解決しても、定期的にモニタをオフにし続ける動作は必要だと思っています。 ここからが今回の問題でして、モニタがオフであるにもかかわらずPostMessageを送ってしまうと、次にマウスを動かしてモニタをウェイクアップさせても、なぜかすぐにオフになってしまう場合があります。 これを避けるために、PostMessageを送る前に、ちゃんとモニタがオンになっているかどうかを確認する方法を探しています。 環境はWindows XPと7です。 C・C++のカテゴリに書きましたが、実際の開発環境はVB6です。 なので、できればAPI関数かActiveXが知りたいですが、DLLでラップできればMFCなどでもかまいません。 しかし、VB6なのでウィンドウメッセージコールバックやCLI/.NETは扱えません。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
ShellAPIにスクリーンセーバー用のAPIがあるので、自分でキーボードやマウスを監視する手法はお勧め出来ません。 また、定期的にモニタをオフし続けるのもお勧め出来ません。 アプリケーションをスクリーンセーバーとして構築し、ウェークアップ処理やモニタのオンオフ処理は、Windows標準のスクリーンセーバー処理にすべて移管し、アプリケーション側からは、一切、手を出してはいけません(Windows標準のスクリーンセーバー機能、電源管理機能と干渉し、不具合を起します) どうしても、自分でウェークアップ処理やモニタのオンオフ処理を行いたいのであれば、事前に、Windows標準のスクリーンセーバーと電源管理を停止させておく必要があります。
お礼
自己解決しそうです。 hMonitor = CreateFile("\\\\.\\LCD", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0) GetDevicePowerState(hDevice, ret); if(ret){ PostMessage(-1, 274, 61808, 2); } しかし、デバイス名をLCDとしているので、CRTモニタの場合はどうなるのか、別質問にしました。 http://okwave.jp/qa/q7118405.html
補足
回答ありがとうございます。 スクリーンセーバーやモニタ電源オフを抑制するゲーム実行中にモニタをオフにするのが目的なので、スクリーンセーバーにはできません。 電源管理と干渉するなら、モニタオフをしない設定にすることを推奨とすることを説明書に記述しようと思います。