実現したいこと
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
コンソールアプリで作っています。