teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

困っていることの変更,ソースコードの追記と変更

2019/05/12 10:44

投稿

dem0nmichik0
dem0nmichik0

スコア37

title CHANGED
File without changes
body CHANGED
@@ -6,13 +6,18 @@
6
6
  ~~1. SetCursoPos(x, y)でカーソルを任意の位置に移動~~
7
7
  ~~2. keybd_evnetでキーボードを押す/離す~~
8
8
 
9
- 修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);にbreakを貼って一行上の「hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);の「hdesk」の状態をIDEのインスペクトで見てみると「????」となっていました.「OpenDesktop」について調べた結果,「[Window Stationとデスクトップ - kkAyatakaのメモ帳。](http://http://kkayataka.hatenablog.com/entry/2014/10/11/145913)」に「OpenDesktop」は「WPFではうまくいかない.」とありました.WPFのことをあまり分かっていないのですが,C++Builderで作成したアプリケーションは「VCLアプリケーション」であり,WPFであるから大丈夫なのではないでしょうか?ご教授お願いいたします.
9
+ ~~修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);にbreakを貼って一行上の「hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);の「hdesk」の状態をIDEのインスペクトで見てみると「????」となっていました.「OpenDesktop」について調べた結果,「[Window Stationとデスクトップ - kkAyatakaのメモ帳。](http://http://kkayataka.hatenablog.com/entry/2014/10/11/145913)」に「OpenDesktop」は「WPFではうまくいかない.」とありました.WPFのことをあまり分かっていないのですが,C++Builderで作成したアプリケーションは「VCLアプリケーション」であり,WPFであるから大丈夫なのではないでしょうか?ご教授お願いいたします.~~
10
10
 
11
- 別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.
11
+ ~~別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.~~
12
- 0. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.
12
+ ~~1. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.~~
13
- 0. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.
13
+ ~~2. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.~~
14
- 「SystemParametersInfo」の使い方が間違っているのでしょうか?
14
+ ~~「SystemParametersInfo」の使い方が間違っているのでしょうか?~~
15
15
 
16
+ 修正後の「screensaver.cpp」ではbcc32.exeでコンパイルするときに「-tWM」オプションを付ければ,任意の動作(スクリーンセーバーがかかったあと,5秒後に解除される)になることを確認しました.
17
+ なので,その処理をC++Builder上で実現するために「Unit1.cpp」と「Unit1.h」を修正後,「Unit2.cpp」と「Unit2.h」を追加してC++Builder10.2のIDEでコンパイルしましたが次のエラーが出て困っています.
18
+ 0. E2034 'void(void *)'型は'void (*)(void *)'型に変換できない
19
+ 0. E2342 パラメータ'__start’はvoid (*)(void *)型として定義されているのでvoid(__fastcall *)(void *)は渡せない
20
+
16
21
  ### 確認したこと(試したこと)
17
22
  ~~1. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)~~
18
23
  ~~2. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.~~
@@ -46,9 +51,13 @@
46
51
 
47
52
  #include <vcl.h>
48
53
  #pragma hdrstop
54
+ // コンパイルオプションの追加
55
+ #pragma checkoption -tWM
49
56
 
50
- #include "Unit1.h"
57
+ #include "unit1.h"
58
+ #include "Unit2.h"
51
59
  #include <windows.h>
60
+ #include <process.h>
52
61
  //---------------------------------------------------------------------------
53
62
  #pragma package(smart_init)
54
63
  #pragma resource "*.dfm"
@@ -57,7 +66,8 @@
57
66
  __fastcall TForm1::TForm1(TComponent* Owner)
58
67
  : TForm(Owner)
59
68
  {
60
- cnt = 0;
69
+ cnt = 0;
70
+ screensaver = false;
61
71
  Form1->Left = (Screen->Monitors[0]->Width / 2) - (Form1->Width / 2);
62
72
  Form1->Top = (Screen->Monitors[0]->Height / 2) - (Form1->Height / 2);
63
73
  memset( &hdesk, 0, sizeof(HDESK) );
@@ -75,54 +85,32 @@
75
85
 
76
86
  Label1->Caption = "X座標:" + IntToStr((int)pt.X) + ", Y座標:" + IntToStr((int)pt.Y);
77
87
 
78
- SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screenSaver, 0);
88
+ SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
79
- if( screenSaver == true)
89
+ if( screensaver == true)
80
90
  {
91
+ // 5秒後(周期は500ms)
81
92
  if( cnt >= 10 )
82
93
  {
83
- // SetCursorPos(x, y);
94
+ // ウィンドウを作成するとSetThreadDesktopできないのでスレッドを起動
95
+ _beginthread(screenSaver, 0, NULL);
84
96
 
85
- // 元のデスクトップハンドルを退避
86
- hdesk_old = GetThreadDesktop(GetCurrentThreadId());
87
-
88
- // スクリーンセーバーのデスクトップを開く
89
- hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
90
- if( hdesk != NULL )
91
- {
92
- // 現在のスレッドのデスクトップを変更
93
- SetThreadDesktop(hdesk);
94
- }
95
-
96
- // スクリーンセーバー解除処理(キーボードの押す/離す)
97
- keybd_event( VK_ESCAPE, 0, 0, 0 );
98
- keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
99
- // ShowMessage("スクリーンセーバー解除したよ");
100
-
101
- if( hdesk != NULL )
102
- {
103
- CloseDesktop(hdesk);
104
- }
105
-
106
97
  cnt = 0;
107
98
  }
108
99
  cnt++;
109
100
  }
110
-
111
-
112
101
  }
113
102
  //---------------------------------------------------------------------------
114
103
  void __fastcall TForm1::Button1Click(TObject *Sender)
115
104
  {
116
-
117
105
  int x = 0;
118
106
  int y = 0;
119
107
 
120
108
  x = Form1->Width / 2;
121
109
  y = Form1->Height / 2;
122
110
  SetCursorPos(x, y);
123
-
124
111
  }
125
112
  //---------------------------------------------------------------------------
113
+
126
114
  ```
127
115
  <Unit1.h>
128
116
  ```C++
@@ -150,7 +138,7 @@
150
138
  __fastcall TForm1(TComponent* Owner);
151
139
 
152
140
  TPoint pt;
153
- bool screenSaver;
141
+ bool screensaver;
154
142
  int cnt;
155
143
  HDESK hdesk;
156
144
  HDESK hdesk_old;
@@ -161,15 +149,73 @@
161
149
  #endif
162
150
  ```
163
151
 
152
+ <Unit2.cpp>
153
+ ```c++
154
+ //---------------------------------------------------------------------------
155
+
156
+ #pragma hdrstop
157
+
158
+ #include "unit1.h"
159
+ #include "Unit2.h"
160
+ #include <windows.h>
161
+ #include <process.h>
162
+ //---------------------------------------------------------------------------
163
+ #pragma package(smart_init
164
+
165
+ //---------------------------------------------------------------------------
166
+ //void __fastcall screenSaver(void *)
167
+ void __fastcall screenSaver(void *a)
168
+ {
169
+ // 元のデスクトップハンドルを退避
170
+ hdesk_old = GetThreadDesktop(GetCurrentThreadId());
171
+
172
+ // スクリーンセーバーのデスクトップを開く
173
+ hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
174
+ if( hdesk != NULL )
175
+ {
176
+ // 現在のスレッドのデスクトップを変更
177
+ SetThreadDesktop(hdesk);
178
+ }
179
+
180
+ // スクリーンセーバー解除処理(キーボードの押す/離す)
181
+ keybd_event( VK_ESCAPE, 0, 0, 0 );
182
+ keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
183
+
184
+ // 元のデスクトップに戻す
185
+ SetThreadDesktop(hdesk_old);
186
+ if( hdesk != NULL )
187
+ {
188
+ CloseDesktop(hdesk);
189
+ }
190
+ }
191
+ //---------------------------------------------------------------------------
192
+ ```
193
+
194
+ <Unit2.h>
195
+ ```c++
196
+ //---------------------------------------------------------------------------
197
+
198
+ #ifndef Unit2H
199
+ #define Unit2H
200
+ //---------------------------------------------------------------------------
201
+
202
+ // スクリーンセーバー解除
203
+ void __fastcall screenSaver(void *);
204
+
205
+ //---------------------------------------------------------------------------
206
+ #endif
207
+ ```
208
+
164
209
  <screensaver.cpp>
165
210
  ```c++
166
211
  // 標準ヘッダー宣言
167
- #include <windows.h>
212
+ #include <Windows.h>
213
+ #include <process.h>
168
214
 
169
215
  // プロトタイプ宣言
170
216
  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
171
217
  char szClassName[] = "ウィンドウクラス・ネーム";
172
- void screenSaver(HWND);
218
+ void screenSaver(void *a);
173
219
 
174
220
  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
175
221
  LPSTR lpszCmdLine, int nCmdShow)
@@ -224,17 +270,14 @@
224
270
 
225
271
  // スクリーンセーバー状態の取得
226
272
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
227
- // SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (void *)&screensaver, 0);
228
273
  // スクリーンセーバーが有効の場合
229
274
  if( screensaver == true )
230
275
  {
231
276
  // 5秒後
232
277
  Sleep(5000);
233
278
 
234
-
235
- // SystemParametersInfo下記モジュールコールする
279
+ // ウィンドウを作成するとSetThreadDesktopできないのでスレッド起動する
236
- // スクリーンセーバーはかかるがスクリーンセーバーが解除されない.
237
- screenSaver(hWnd); // スクリーンセーバーの解除
280
+ _beginthread(screenSaver, 0, NULL);
238
281
  }
239
282
  }
240
283
  return (int)msg.wParam;
@@ -255,12 +298,11 @@
255
298
  return (0L);
256
299
  }
257
300
 
258
- void screenSaver(HWND hWnd)
301
+ void screenSaver(void *a)
259
302
  {
260
303
  // 元のデスクトップハンドルを退避
261
304
  HDESK hdesk_old = GetThreadDesktop(GetCurrentThreadId());
262
305
  // スクリーンセーバーのデスクトップを開く
263
- // HDESK hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
264
306
  HDESK hdesk = OpenDesktop("Screen-saver", 0, FALSE, GENERIC_ALL);
265
307
  if( hdesk != NULL )
266
308
  {

1

困っていること,確認したこと,ソースコードの修正,

2019/05/12 10:44

投稿

dem0nmichik0
dem0nmichik0

スコア37

title CHANGED
File without changes
body CHANGED
@@ -2,21 +2,28 @@
2
2
  「スクリーンセーバーがかかっている」かつ「フラグがON」のとき,「スクリーンセーバーを解除したい」です.
3
3
 
4
4
  ### 困っていること
5
- 現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.
5
+ ~~現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.~~
6
- 0. SetCursoPos(x, y)でカーソルを任意の位置に移動
6
+ ~~1. SetCursoPos(x, y)でカーソルを任意の位置に移動~~
7
- 0. keybd_evnetでキーボードを押す/離す
7
+ ~~2. keybd_evnetでキーボードを押す/離す~~
8
8
 
9
+ 修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);にbreakを貼って一行上の「hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);の「hdesk」の状態をIDEのインスペクトで見てみると「????」となっていました.「OpenDesktop」について調べた結果,「[Window Stationとデスクトップ - kkAyatakaのメモ帳。](http://http://kkayataka.hatenablog.com/entry/2014/10/11/145913)」に「OpenDesktop」は「WPFではうまくいかない.」とありました.WPFのことをあまり分かっていないのですが,C++Builderで作成したアプリケーションは「VCLアプリケーション」であり,WPFであるから大丈夫なのではないでしょうか?ご教授お願いいたします.
10
+
11
+ 別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.
12
+ 0. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.
13
+ 0. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.
14
+ 「SystemParametersInfo」の使い方が間違っているのでしょうか?
15
+
9
16
  ### 確認したこと(試したこと)
10
- 0. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)
17
+ ~~1. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)~~
11
- 0. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.
18
+ ~~2. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.~~
12
- 0. ボタンイベント実行時に「SetCursorPos」でマウスカーソル位置が指定位置に移動している.
19
+ ~~3. ボタンイベント実行時に「SetCursorPos」でマウスカーソル位置が指定位置に移動している.~~
13
20
 
14
21
  ###原因または解決方法
15
- 【原因】
16
- 「SetCursorPos」や「keybd_event」はWindows32APIだから64bitOSでは動作しないのではないか?でも,そうするとスクリーンセーバーがかかっていないときにボタンイベントで「SetCursorPos」でマウスカーソル位置が指定位置に移動していることが不思議でなりません.WIN32APIだから,スクリーンセーバーがかかていないときに使えても,スクリーンセーバーかかているときは使えないって言われれば,納得するのでが.
22
+ ~~【原因】
23
+ 「SetCursorPos」や「keybd_event」はWindows32APIだから64bitOSでは動作しないのではないか?でも,そうするとスクリーンセーバーがかかっていないときにボタンイベントで「SetCursorPos」でマウスカーソル位置が指定位置に移動していることが不思議でなりません.WIN32APIだから,スクリーンセーバーがかかていないときに使えても,スクリーンセーバーかかているときは使えないって言われれば,納得するのでが.
17
24
  【解決方法】
18
25
  リアルタイムでマウス座標を取得して,「スクリーンセーバーがかかっている」かつ「5秒後」のときに「マウスカーソルを移動する」でスクリーンセーバーを解除できると思っています.
19
- リアルタイムでマウス座標を取得方法は分かりました(TPoint型のMouse->CursorPos).また,任意のマウス位置を設定する方法(SetLocation(x, y)メソッド)も分かりました.その後,マウスカーソルを移動する方法が分かりません.ご教授お願いいたします.
26
+ リアルタイムでマウス座標を取得方法は分かりました(TPoint型のMouse->CursorPos).また,任意のマウス位置を設定する方法(SetLocation(x, y)メソッド)も分かりました.その後,マウスカーソルを移動する方法が分かりません.ご教授お願いいたします.~~
20
27
 
21
28
  ### 下記ソースの開発環境
22
29
  OS:Windows10 64bit
@@ -29,7 +36,7 @@
29
36
  言語:C++
30
37
  開発環境のバージョンのみ異なります.
31
38
 
32
- ### ソースコード
39
+ ### 修正後のソースコード
33
40
  「注意点」
34
41
  「スクリーンセーバーがかかっている」かつ「フラグがON」のとき,「スクリーンセーバーを解除したい」と書きましたが,このソースコードではスクリーンセーバーがかかっているときに「フラグON」にすることができないので,「スクリーンセーバーがかかっている」かつ「5秒後」の条件でコーディングしています.
35
42
  <Unit1.cpp>
@@ -41,6 +48,7 @@
41
48
  #pragma hdrstop
42
49
 
43
50
  #include "Unit1.h"
51
+ #include <windows.h>
44
52
  //---------------------------------------------------------------------------
45
53
  #pragma package(smart_init)
46
54
  #pragma resource "*.dfm"
@@ -52,6 +60,8 @@
52
60
  cnt = 0;
53
61
  Form1->Left = (Screen->Monitors[0]->Width / 2) - (Form1->Width / 2);
54
62
  Form1->Top = (Screen->Monitors[0]->Height / 2) - (Form1->Height / 2);
63
+ memset( &hdesk, 0, sizeof(HDESK) );
64
+ memset( &hdesk_old, 0, sizeof(HDESK) );
55
65
  }
56
66
  //---------------------------------------------------------------------------
57
67
  void __fastcall TForm1::Timer1Timer(TObject *Sender)
@@ -71,14 +81,34 @@
71
81
  if( cnt >= 10 )
72
82
  {
73
83
  // SetCursorPos(x, y);
84
+
85
+ // 元のデスクトップハンドルを退避
86
+ hdesk_old = GetThreadDesktop(GetCurrentThreadId());
87
+
74
- // スクリーンセーバーの解除(エケーキー離す)
88
+ // スクリーンセーバーのクトップを開く
89
+ hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
90
+ if( hdesk != NULL )
91
+ {
92
+ // 現在のスレッドのデスクトップを変更
93
+ SetThreadDesktop(hdesk);
94
+ }
95
+
96
+ // スクリーンセーバー解除処理(キーボードの押す/離す)
97
+ keybd_event( VK_ESCAPE, 0, 0, 0 );
75
98
  keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
76
- ShowMessage("スクリーンセーバー解除したよ");
99
+ // ShowMessage("スクリーンセーバー解除したよ");
100
+
77
- int a = 0; // 一行上をBreakで確認するためのテスト用の処理
101
+ if( hdesk != NULL )
102
+ {
103
+ CloseDesktop(hdesk);
104
+ }
105
+
106
+ cnt = 0;
78
107
  }
108
+ cnt++;
79
109
  }
80
- cnt++;
81
110
 
111
+
82
112
  }
83
113
  //---------------------------------------------------------------------------
84
114
  void __fastcall TForm1::Button1Click(TObject *Sender)
@@ -121,10 +151,133 @@
121
151
 
122
152
  TPoint pt;
123
153
  bool screenSaver;
124
- int cnt;
154
+ int cnt;
155
+ HDESK hdesk;
156
+ HDESK hdesk_old;
125
157
  };
126
158
  //---------------------------------------------------------------------------
127
159
  extern PACKAGE TForm1 *Form1;
128
160
  //---------------------------------------------------------------------------
129
161
  #endif
162
+ ```
163
+
164
+ <screensaver.cpp>
165
+ ```c++
166
+ // 標準ヘッダー宣言
167
+ #include <windows.h>
168
+
169
+ // プロトタイプ宣言
170
+ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
171
+ char szClassName[] = "ウィンドウクラス・ネーム";
172
+ void screenSaver(HWND);
173
+
174
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
175
+ LPSTR lpszCmdLine, int nCmdShow)
176
+ {
177
+ HWND hWnd;
178
+ MSG msg;
179
+ WNDCLASS myProg;
180
+ bool screensaver;
181
+ HDC hdc;
182
+ PAINTSTRUCT ps;
183
+
184
+ // ウィンドウ・クラスの登録
185
+ if( !hPreInst )
186
+ {
187
+ myProg.style = CS_HREDRAW | CS_VREDRAW;
188
+ myProg.lpfnWndProc = WndProc; // プロシージャ名
189
+ myProg.cbClsExtra = 0;
190
+ myProg.cbWndExtra = 0;
191
+ myProg.hInstance = hInstance; // インスタンス
192
+ myProg.hIcon = NULL;
193
+ myProg.hCursor = LoadCursor(NULL, IDC_ARROW);
194
+ myProg.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
195
+ myProg.lpszMenuName = NULL;
196
+ myProg.lpszClassName = szClassName;
197
+ if( !RegisterClass(&myProg) )
198
+ {
199
+ return (false);
200
+ }
201
+ }
202
+
203
+ // ウィンドウの生成
204
+ hWnd = CreateWindow(szClassName,
205
+ "猫でも分かるプログラミング", // タイトルバーにこの名前が表示される
206
+ WS_OVERLAPPEDWINDOW, // ウィンドウの種類
207
+ CW_USEDEFAULT, // X座標
208
+ CW_USEDEFAULT, // Y座標
209
+ CW_USEDEFAULT, // 幅
210
+ CW_USEDEFAULT, // 高さ
211
+ NULL, // 親ウィンドウのハンドル,親を作るときはNULL
212
+ NULL, // メニューハンドル,クラスメニューを使うときはNULL
213
+ hInstance, // インスタンスハンドル
214
+ NULL);
215
+ ShowWindow(hWnd, nCmdShow);
216
+ UpdateWindow(hWnd);
217
+ while( GetMessage(&msg, NULL, 0, 0) )
218
+ {
219
+ TranslateMessage(&msg);
220
+ DispatchMessage(&msg);
221
+ // 下記モジュールのみをコールするだけだとスクリーンセーバーがかからないので,
222
+ // スクリーンセーバーの抑止(キーボードの押す/離す)していることを確認
223
+ // screenSaver(hWnd); // スクリーンセーバーの解除
224
+
225
+ // スクリーンセーバー状態の取得
226
+ SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
227
+ // SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (void *)&screensaver, 0);
228
+ // スクリーンセーバーが有効の場合
229
+ if( screensaver == true )
230
+ {
231
+ // 5秒後
232
+ Sleep(5000);
233
+
234
+
235
+ // SystemParametersInfoの中で下記モジュールをコールすると
236
+ // スクリーンセーバーはかかるがスクリーンセーバーが解除されない.
237
+ screenSaver(hWnd); // スクリーンセーバーの解除
238
+ }
239
+ }
240
+ return (int)msg.wParam;
241
+ }
242
+
243
+ // ウィンドウプロシージャ
244
+ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
245
+ {
246
+ switch(msg)
247
+ {
248
+ case WM_DESTROY:
249
+ PostQuitMessage(0);
250
+ break;
251
+ default:
252
+ return (DefWindowProc(hWnd, msg, wParam, lParam));
253
+ }
254
+
255
+ return (0L);
256
+ }
257
+
258
+ void screenSaver(HWND hWnd)
259
+ {
260
+ // 元のデスクトップハンドルを退避
261
+ HDESK hdesk_old = GetThreadDesktop(GetCurrentThreadId());
262
+ // スクリーンセーバーのデスクトップを開く
263
+ // HDESK hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
264
+ HDESK hdesk = OpenDesktop("Screen-saver", 0, FALSE, GENERIC_ALL);
265
+ if( hdesk != NULL )
266
+ {
267
+ // 現在のスレッドのデスクトップを変更
268
+ SetThreadDesktop(hdesk);
269
+ }
270
+ // スクリーンセーバー解除処理
271
+ keybd_event(VK_ESCAPE, 0, 0, 0);
272
+ keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
273
+
274
+ // 元のデスクトップに戻す
275
+ SetThreadDesktop(hdesk_old);
276
+ if( hdesk != NULL )
277
+ {
278
+ CloseDesktop(hdesk);
279
+ }
280
+
281
+ }
282
+
130
283
  ```