質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

331閲覧

スクリーンセイバーが起動か、ディスプレイがオフになった時に、実行したいコードがある

One_of_Arthur

総合スコア81

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/05/03 01:25

編集2024/05/05 07:09

実現したいこと

VisualStudio C++で開発しています。
スクリーンセイバーが起動か、ディスプレイがオフになった時に、実行したいコードがあります。

発生している問題・分からないこと

状態を判定するためのコードが分かりません。
教えてください。

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ググってみましたが、キーワードが悪いのか、解決に至りませんでした。

コメント頂きましてありがとうございます。
下記のソースで、スクリーンセイバーの状態を取得することに成功しました。

C++

1#include <Windows.h> 2#include <stdio.h> 3 4int main(void) 5{ 6 bool fResult = true; 7 bool pvParam = true; 8 9 while (true) 10 { 11 fResult = SystemParametersInfo( 12 SPI_GETSCREENSAVERRUNNING, 13 0, 14 &pvParam, 15 0 16 ); 17 if (!pvParam) 18 { 19 printf("スクリーンセイバーが起動しました。\n"); 20 } 21 } 22 23}

あと、ディスプレイがオフになった時が分かりません。
「WM_POWERBROADCAST メッセージ」を取得するには、「WindowProc 関数」を使うようですが、読んでも理解ができないです。
https://learn.microsoft.com/ja-jp/windows/win32/power/wm-powerbroadcast

下記のような記述では、ダメみたいです。

C++

1#include <iostream> 2#include <windows.h> 3 4int main() 5{ 6 while (true) 7 { 8 HWND hActWin = GetForegroundWindow(); // フォアグラウンドアプリのハンドル取得 9 UINT uMsg = NULL; 10 if (hActWin) 11 { 12 LRESULT CALLBACK WindowProc( 13 HWND hActWin, // handle to window 14 UINT uMsg, // WM_POWERBROADCAST 15 WPARAM wParam, // power-management event 16 LPARAM lParam // function-specific data 17 ); 18 } 19 if (uMsg == WM_POWERBROADCAST) 20 { 21 printf("ディスプレイがOFFになりました。"); 22 } 23 } 24}

https://qiita.com/tera1707/items/dc4d261fd0d64b8fc725
に載っている「実験コード(C++)」は、コメントを参考に動きましたが、まだコードを理解できずにいます。

補足

Microsoft Visual Studio Community 2022
Version 17.9.6
VisualStudio.17.Release/17.9.6+34728.123

コンソールアプリで作っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2024/05/03 02:31 編集

スクリーンセーバーに関してはSystemParametersInfoで実現可能かと思います。
YAmaGNZ

2024/05/03 02:36

モニターのOFFはWM_POWERBROADCASTメッセージでなんとかできそう
hiroki-o

2024/05/03 17:25 編集

ちなみに、UIは何のフレームワークで組んでいますか? それともコマンドラインでしょうか? メッセージ処理も絡んでくるので、何の指定も無いとサンプルを示しづらいです。 ・Windows SDK ・MFC ・C++/WinRT(UWP) ・C++/WinRT(WinUI 3) ・その他
hiroki-o

2024/05/04 04:19

>「WM_POWERBROADCAST メッセージ」を取得するには、「WindowProc 関数」を使うようですが、その関数のウィンドウのハンドルの取得で躓いてます。 だから、UIを何で組んでいるのか明示すると、回答が得られやすいと思います。 まさか本番プログラムもwhile回しっぱなしですか?
One_of_Arthur

2024/05/04 05:33

Cconsole Applicationで作ってます。 while回しっぱなしです。それしか知らないので。 一応、Sleep(100);はさんで、 SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS)を記述してますけれど、、、
hiroki-o

2024/05/04 09:22 編集

細かい説明抜きで、Qiitaのリンク先のサンプルを動かす手順 1.「新しいプロジェクトの作成」でWindowsデスクトップウィザードを選択 2.アプリケーションの種類で「デスクトップアプリケーション(.exe)」を選択 3.生成された.cppソースの中身を全削除して、リンク先のサンプルをコピペ (追記)2個目のインクルードファイル名は自分のに変更してください 4.DialogBox行の「L"MyTestDlgBase_Main"」を「MAKEINTRESOURCE(IDD_ABOUTBOX)」に変更 5.終了させる場合は、デバッグの停止ボタン このサンプルの場合、 ・最初はONで、電源プランの編集で設定した時間のOFFに反応します。手動でOFFにした場合は反応しません。 ・フレームワークはWindows SDKになります。コンソールアプリとは考え方が違う部分があります。
One_of_Arthur

2024/05/05 06:55

ありがとうございます。 とりあえず、「実験コード(C++)」は動きました。 解析、というかソースコードを読んでみます。
guest

回答1

0

[香車]東上☆あらし☆海美「
『スクリーンセイバーの起動時に、実行したいコードがあります』なら、
実行したいコードを実行するプログラムを、スクリーンセーバーとして登録すればいいんじゃないの ?

投稿2024/05/04 13:28

umimi

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

One_of_Arthur

2024/05/05 06:58

回答、ありがとうございます。 ですが、そういうことではないんですね。 スクリーンセイバー起動に同期して、とある機器のLEDを消灯したいのです。 なので、その機器を制御しているコードに書き込まないといけないのです。
umimi

2024/05/05 11:50

『実行したいコードを実行したあと、本来のスクリーンセーバーを起動するプログラム』を、スクリーンセーバーとして登録すればいいんじゃないの ?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問