質問編集履歴

2

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

2019/05/12 10:44

投稿

dem0nmichik0
dem0nmichik0

スコア37

test CHANGED
File without changes
test CHANGED
@@ -14,17 +14,27 @@
14
14
 
15
15
 
16
16
 
17
- 修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,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であるから大丈夫なのではないでしょうか?ご教授お願いいたします.
18
-
19
-
20
-
21
- 別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.
22
-
23
- 0. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.
24
-
25
- 0. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.
26
-
27
- 「SystemParametersInfo」の使い方が間違っているのでしょうか?
17
+ ~~修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,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であるから大丈夫なのではないでしょうか?ご教授お願いいたします.~~
18
+
19
+
20
+
21
+ ~~別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.~~
22
+
23
+ ~~1. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.~~
24
+
25
+ ~~2. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.~~
26
+
27
+ ~~「SystemParametersInfo」の使い方が間違っているのでしょうか?~~
28
+
29
+
30
+
31
+ 修正後の「screensaver.cpp」ではbcc32.exeでコンパイルするときに「-tWM」オプションを付ければ,任意の動作(スクリーンセーバーがかかったあと,5秒後に解除される)になることを確認しました.
32
+
33
+ なので,その処理をC++Builder上で実現するために「Unit1.cpp」と「Unit1.h」を修正後,「Unit2.cpp」と「Unit2.h」を追加してC++Builder10.2のIDEでコンパイルしましたが次のエラーが出て困っています.
34
+
35
+ 0. E2034 'void(void *)'型は'void (*)(void *)'型に変換できない
36
+
37
+ 0. E2342 パラメータ'__start’はvoid (*)(void *)型として定義されているのでvoid(__fastcall *)(void *)は渡せない
28
38
 
29
39
 
30
40
 
@@ -94,12 +104,20 @@
94
104
 
95
105
  #pragma hdrstop
96
106
 
97
-
107
+ // コンパイルオプションの追加
108
+
98
-
109
+ #pragma checkoption -tWM
110
+
111
+
112
+
99
- #include "Unit1.h"
113
+ #include "unit1.h"
114
+
115
+ #include "Unit2.h"
100
116
 
101
117
  #include <windows.h>
102
118
 
119
+ #include <process.h>
120
+
103
121
  //---------------------------------------------------------------------------
104
122
 
105
123
  #pragma package(smart_init)
@@ -116,7 +134,9 @@
116
134
 
117
135
  {
118
136
 
119
- cnt = 0;
137
+ cnt = 0;
138
+
139
+ screensaver = false;
120
140
 
121
141
  Form1->Left = (Screen->Monitors[0]->Width / 2) - (Form1->Width / 2);
122
142
 
@@ -152,59 +172,21 @@
152
172
 
153
173
 
154
174
 
155
- SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screenSaver, 0);
175
+ SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
156
-
176
+
157
- if( screenSaver == true)
177
+ if( screensaver == true)
158
-
178
+
159
- {
179
+ {
180
+
181
+ // 5秒後(周期は500ms)
160
182
 
161
183
  if( cnt >= 10 )
162
184
 
163
185
  {
164
186
 
165
- // SetCursorPos(x, y);
166
-
167
-
168
-
169
- // 元のデスクトップハンドルを退避
170
-
171
- hdesk_old = GetThreadDesktop(GetCurrentThreadId());
172
-
173
-
174
-
175
- // スクリーンセーバーのデスクトップを開く
176
-
177
- hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
178
-
179
- if( hdesk != NULL )
180
-
181
- {
182
-
183
- // 現在のスレッドのデスクトップを変更
184
-
185
- SetThreadDesktop(hdesk);
186
-
187
- }
188
-
189
-
190
-
191
- // スクリーセーバー解除処理(キーボードの押す/離す)
187
+ // ウィンドウを作成するとSetThreadDesktopできないでスレッドを起動
192
-
188
+
193
- keybd_event( VK_ESCAPE, 0, 0, 0 );
189
+ _beginthread(screenSaver, 0, NULL);
194
-
195
- keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
196
-
197
- // ShowMessage("スクリーンセーバー解除したよ");
198
-
199
-
200
-
201
- if( hdesk != NULL )
202
-
203
- {
204
-
205
- CloseDesktop(hdesk);
206
-
207
- }
208
190
 
209
191
 
210
192
 
@@ -216,10 +198,6 @@
216
198
 
217
199
  }
218
200
 
219
-
220
-
221
-
222
-
223
201
  }
224
202
 
225
203
  //---------------------------------------------------------------------------
@@ -228,8 +206,6 @@
228
206
 
229
207
  {
230
208
 
231
-
232
-
233
209
  int x = 0;
234
210
 
235
211
  int y = 0;
@@ -242,12 +218,12 @@
242
218
 
243
219
  SetCursorPos(x, y);
244
220
 
245
-
246
-
247
221
  }
248
222
 
249
223
  //---------------------------------------------------------------------------
250
224
 
225
+
226
+
251
227
  ```
252
228
 
253
229
  <Unit1.h>
@@ -302,7 +278,7 @@
302
278
 
303
279
  TPoint pt;
304
280
 
305
- bool screenSaver;
281
+ bool screensaver;
306
282
 
307
283
  int cnt;
308
284
 
@@ -324,13 +300,129 @@
324
300
 
325
301
 
326
302
 
303
+ <Unit2.cpp>
304
+
305
+ ```c++
306
+
307
+ //---------------------------------------------------------------------------
308
+
309
+
310
+
311
+ #pragma hdrstop
312
+
313
+
314
+
315
+ #include "unit1.h"
316
+
317
+ #include "Unit2.h"
318
+
319
+ #include <windows.h>
320
+
321
+ #include <process.h>
322
+
323
+ //---------------------------------------------------------------------------
324
+
325
+ #pragma package(smart_init
326
+
327
+
328
+
329
+ //---------------------------------------------------------------------------
330
+
331
+ //void __fastcall screenSaver(void *)
332
+
333
+ void __fastcall screenSaver(void *a)
334
+
335
+ {
336
+
337
+ // 元のデスクトップハンドルを退避
338
+
339
+ hdesk_old = GetThreadDesktop(GetCurrentThreadId());
340
+
341
+
342
+
343
+ // スクリーンセーバーのデスクトップを開く
344
+
345
+ hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
346
+
347
+ if( hdesk != NULL )
348
+
349
+ {
350
+
351
+ // 現在のスレッドのデスクトップを変更
352
+
353
+ SetThreadDesktop(hdesk);
354
+
355
+ }
356
+
357
+
358
+
359
+ // スクリーンセーバー解除処理(キーボードの押す/離す)
360
+
361
+ keybd_event( VK_ESCAPE, 0, 0, 0 );
362
+
363
+ keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
364
+
365
+
366
+
367
+ // 元のデスクトップに戻す
368
+
369
+ SetThreadDesktop(hdesk_old);
370
+
371
+ if( hdesk != NULL )
372
+
373
+ {
374
+
375
+ CloseDesktop(hdesk);
376
+
377
+ }
378
+
379
+ }
380
+
381
+ //---------------------------------------------------------------------------
382
+
383
+ ```
384
+
385
+
386
+
387
+ <Unit2.h>
388
+
389
+ ```c++
390
+
391
+ //---------------------------------------------------------------------------
392
+
393
+
394
+
395
+ #ifndef Unit2H
396
+
397
+ #define Unit2H
398
+
399
+ //---------------------------------------------------------------------------
400
+
401
+
402
+
403
+ // スクリーンセーバー解除
404
+
405
+ void __fastcall screenSaver(void *);
406
+
407
+
408
+
409
+ //---------------------------------------------------------------------------
410
+
411
+ #endif
412
+
413
+ ```
414
+
415
+
416
+
327
417
  <screensaver.cpp>
328
418
 
329
419
  ```c++
330
420
 
331
421
  // 標準ヘッダー宣言
332
422
 
333
- #include <windows.h>
423
+ #include <Windows.h>
424
+
425
+ #include <process.h>
334
426
 
335
427
 
336
428
 
@@ -340,7 +432,7 @@
340
432
 
341
433
  char szClassName[] = "ウィンドウクラス・ネーム";
342
434
 
343
- void screenSaver(HWND);
435
+ void screenSaver(void *a);
344
436
 
345
437
 
346
438
 
@@ -450,8 +542,6 @@
450
542
 
451
543
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
452
544
 
453
- // SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (void *)&screensaver, 0);
454
-
455
545
  // スクリーンセーバーが有効の場合
456
546
 
457
547
  if( screensaver == true )
@@ -464,13 +554,9 @@
464
554
 
465
555
 
466
556
 
467
-
468
-
469
- // SystemParametersInfoの下記モジュールコールする
557
+ // ウィンドウを作成するとSetThreadDesktopできないのでスレッド起動する
470
-
471
- // スクリーンセーバーはかかるがスクリーンセーバーが解除されない.
558
+
472
-
473
- screenSaver(hWnd); // スクリーンセーバーの解除
559
+ _beginthread(screenSaver, 0, NULL);
474
560
 
475
561
  }
476
562
 
@@ -512,7 +598,7 @@
512
598
 
513
599
 
514
600
 
515
- void screenSaver(HWND hWnd)
601
+ void screenSaver(void *a)
516
602
 
517
603
  {
518
604
 
@@ -522,8 +608,6 @@
522
608
 
523
609
  // スクリーンセーバーのデスクトップを開く
524
610
 
525
- // HDESK hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
526
-
527
611
  HDESK hdesk = OpenDesktop("Screen-saver", 0, FALSE, GENERIC_ALL);
528
612
 
529
613
  if( hdesk != NULL )

1

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

2019/05/12 10:44

投稿

dem0nmichik0
dem0nmichik0

スコア37

test CHANGED
File without changes
test CHANGED
@@ -6,35 +6,49 @@
6
6
 
7
7
  ### 困っていること
8
8
 
9
- 現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.
10
-
11
- 0. SetCursoPos(x, y)でカーソルを任意の位置に移動
12
-
13
- 0. keybd_evnetでキーボードを押す/離す
9
+ ~~現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.~~
10
+
11
+ ~~1. SetCursoPos(x, y)でカーソルを任意の位置に移動~~
12
+
13
+ ~~2. keybd_evnetでキーボードを押す/離す~~
14
+
15
+
16
+
17
+ 修正後のソースコードでもスクリーンセーバーが解除しません.現状,スクリーンセーバーになることは確認しました.また,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であるから大丈夫なのではないでしょうか?ご教授お願いいたします.
18
+
19
+
20
+
21
+ 別に試したことは,C++BuilderのVCLアプリケーションが原因の可能性があるとおもったので,「screensaver.cpp」を作成後.C++Builderのコンパイラ(bcc32.exe)でコンパイルして実行した結果,下記のようになりました.
22
+
23
+ 0. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.
24
+
25
+ 0. whileの中で「SystemParametesInfo」の第三引数の状態が「true」なら「screenSaver」をコールした時はスクリーンセーバーはかかるが,スクリーンセーバーが解除されないことを確認.
26
+
27
+ 「SystemParametersInfo」の使い方が間違っているのでしょうか?
14
28
 
15
29
 
16
30
 
17
31
  ### 確認したこと(試したこと)
18
32
 
19
- 0. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)
33
+ ~~1. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)~~
20
-
34
+
21
- 0. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.
35
+ ~~2. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.~~
22
-
36
+
23
- 0. ボタンイベント実行時に「SetCursorPos」でマウスカーソル位置が指定位置に移動している.
37
+ ~~3. ボタンイベント実行時に「SetCursorPos」でマウスカーソル位置が指定位置に移動している.~~
24
38
 
25
39
 
26
40
 
27
41
  ###原因または解決方法
28
42
 
29
- 【原因】
30
-
31
- 「SetCursorPos」や「keybd_event」はWindows32APIだから64bitOSでは動作しないのではないか?でも,そうするとスクリーンセーバーがかかっていないときにボタンイベントで「SetCursorPos」でマウスカーソル位置が指定位置に移動していることが不思議でなりません.WIN32APIだから,スクリーンセーバーがかかていないときに使えても,スクリーンセーバーかかているときは使えないって言われれば,納得するのでが.
43
+ ~~【原因】
44
+
45
+ 「SetCursorPos」や「keybd_event」はWindows32APIだから64bitOSでは動作しないのではないか?でも,そうするとスクリーンセーバーがかかっていないときにボタンイベントで「SetCursorPos」でマウスカーソル位置が指定位置に移動していることが不思議でなりません.WIN32APIだから,スクリーンセーバーがかかていないときに使えても,スクリーンセーバーかかているときは使えないって言われれば,納得するのでが.
32
46
 
33
47
  【解決方法】
34
48
 
35
49
  リアルタイムでマウス座標を取得して,「スクリーンセーバーがかかっている」かつ「5秒後」のときに「マウスカーソルを移動する」でスクリーンセーバーを解除できると思っています.
36
50
 
37
- リアルタイムでマウス座標を取得方法は分かりました(TPoint型のMouse->CursorPos).また,任意のマウス位置を設定する方法(SetLocation(x, y)メソッド)も分かりました.その後,マウスカーソルを移動する方法が分かりません.ご教授お願いいたします.
51
+ リアルタイムでマウス座標を取得方法は分かりました(TPoint型のMouse->CursorPos).また,任意のマウス位置を設定する方法(SetLocation(x, y)メソッド)も分かりました.その後,マウスカーソルを移動する方法が分かりません.ご教授お願いいたします.~~
38
52
 
39
53
 
40
54
 
@@ -60,7 +74,7 @@
60
74
 
61
75
 
62
76
 
63
- ### ソースコード
77
+ ### 修正後のソースコード
64
78
 
65
79
  「注意点」
66
80
 
@@ -84,6 +98,8 @@
84
98
 
85
99
  #include "Unit1.h"
86
100
 
101
+ #include <windows.h>
102
+
87
103
  //---------------------------------------------------------------------------
88
104
 
89
105
  #pragma package(smart_init)
@@ -106,6 +122,10 @@
106
122
 
107
123
  Form1->Top = (Screen->Monitors[0]->Height / 2) - (Form1->Height / 2);
108
124
 
125
+ memset( &hdesk, 0, sizeof(HDESK) );
126
+
127
+ memset( &hdesk_old, 0, sizeof(HDESK) );
128
+
109
129
  }
110
130
 
111
131
  //---------------------------------------------------------------------------
@@ -144,19 +164,59 @@
144
164
 
145
165
  // SetCursorPos(x, y);
146
166
 
167
+
168
+
169
+ // 元のデスクトップハンドルを退避
170
+
171
+ hdesk_old = GetThreadDesktop(GetCurrentThreadId());
172
+
173
+
174
+
147
- // スクリーンセーバーの解除(エケーキー離す)
175
+ // スクリーンセーバーのクトップを開く
176
+
177
+ hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
178
+
179
+ if( hdesk != NULL )
180
+
181
+ {
182
+
183
+ // 現在のスレッドのデスクトップを変更
184
+
185
+ SetThreadDesktop(hdesk);
186
+
187
+ }
188
+
189
+
190
+
191
+ // スクリーンセーバー解除処理(キーボードの押す/離す)
192
+
193
+ keybd_event( VK_ESCAPE, 0, 0, 0 );
148
194
 
149
195
  keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );
150
196
 
151
- ShowMessage("スクリーンセーバー解除したよ");
197
+ // ShowMessage("スクリーンセーバー解除したよ");
152
-
198
+
199
+
200
+
153
- int a = 0; // 一行上をBreakで確認するためのテスト用の処理
201
+ if( hdesk != NULL )
202
+
203
+ {
204
+
205
+ CloseDesktop(hdesk);
206
+
207
+ }
208
+
209
+
210
+
211
+ cnt = 0;
154
212
 
155
213
  }
156
214
 
215
+ cnt++;
216
+
157
217
  }
158
218
 
159
- cnt++;
219
+
160
220
 
161
221
 
162
222
 
@@ -244,7 +304,11 @@
244
304
 
245
305
  bool screenSaver;
246
306
 
247
- int cnt;
307
+ int cnt;
308
+
309
+ HDESK hdesk;
310
+
311
+ HDESK hdesk_old;
248
312
 
249
313
  };
250
314
 
@@ -257,3 +321,245 @@
257
321
  #endif
258
322
 
259
323
  ```
324
+
325
+
326
+
327
+ <screensaver.cpp>
328
+
329
+ ```c++
330
+
331
+ // 標準ヘッダー宣言
332
+
333
+ #include <windows.h>
334
+
335
+
336
+
337
+ // プロトタイプ宣言
338
+
339
+ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
340
+
341
+ char szClassName[] = "ウィンドウクラス・ネーム";
342
+
343
+ void screenSaver(HWND);
344
+
345
+
346
+
347
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
348
+
349
+ LPSTR lpszCmdLine, int nCmdShow)
350
+
351
+ {
352
+
353
+ HWND hWnd;
354
+
355
+ MSG msg;
356
+
357
+ WNDCLASS myProg;
358
+
359
+ bool screensaver;
360
+
361
+ HDC hdc;
362
+
363
+ PAINTSTRUCT ps;
364
+
365
+
366
+
367
+ // ウィンドウ・クラスの登録
368
+
369
+ if( !hPreInst )
370
+
371
+ {
372
+
373
+ myProg.style = CS_HREDRAW | CS_VREDRAW;
374
+
375
+ myProg.lpfnWndProc = WndProc; // プロシージャ名
376
+
377
+ myProg.cbClsExtra = 0;
378
+
379
+ myProg.cbWndExtra = 0;
380
+
381
+ myProg.hInstance = hInstance; // インスタンス
382
+
383
+ myProg.hIcon = NULL;
384
+
385
+ myProg.hCursor = LoadCursor(NULL, IDC_ARROW);
386
+
387
+ myProg.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
388
+
389
+ myProg.lpszMenuName = NULL;
390
+
391
+ myProg.lpszClassName = szClassName;
392
+
393
+ if( !RegisterClass(&myProg) )
394
+
395
+ {
396
+
397
+ return (false);
398
+
399
+ }
400
+
401
+ }
402
+
403
+
404
+
405
+ // ウィンドウの生成
406
+
407
+ hWnd = CreateWindow(szClassName,
408
+
409
+ "猫でも分かるプログラミング", // タイトルバーにこの名前が表示される
410
+
411
+ WS_OVERLAPPEDWINDOW, // ウィンドウの種類
412
+
413
+ CW_USEDEFAULT, // X座標
414
+
415
+ CW_USEDEFAULT, // Y座標
416
+
417
+ CW_USEDEFAULT, // 幅
418
+
419
+ CW_USEDEFAULT, // 高さ
420
+
421
+ NULL, // 親ウィンドウのハンドル,親を作るときはNULL
422
+
423
+ NULL, // メニューハンドル,クラスメニューを使うときはNULL
424
+
425
+ hInstance, // インスタンスハンドル
426
+
427
+ NULL);
428
+
429
+ ShowWindow(hWnd, nCmdShow);
430
+
431
+ UpdateWindow(hWnd);
432
+
433
+ while( GetMessage(&msg, NULL, 0, 0) )
434
+
435
+ {
436
+
437
+ TranslateMessage(&msg);
438
+
439
+ DispatchMessage(&msg);
440
+
441
+ // 下記モジュールのみをコールするだけだとスクリーンセーバーがかからないので,
442
+
443
+ // スクリーンセーバーの抑止(キーボードの押す/離す)していることを確認
444
+
445
+ // screenSaver(hWnd); // スクリーンセーバーの解除
446
+
447
+
448
+
449
+ // スクリーンセーバー状態の取得
450
+
451
+ SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
452
+
453
+ // SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (void *)&screensaver, 0);
454
+
455
+ // スクリーンセーバーが有効の場合
456
+
457
+ if( screensaver == true )
458
+
459
+ {
460
+
461
+ // 5秒後
462
+
463
+ Sleep(5000);
464
+
465
+
466
+
467
+
468
+
469
+ // SystemParametersInfoの中で下記モジュールをコールすると
470
+
471
+ // スクリーンセーバーはかかるがスクリーンセーバーが解除されない.
472
+
473
+ screenSaver(hWnd); // スクリーンセーバーの解除
474
+
475
+ }
476
+
477
+ }
478
+
479
+ return (int)msg.wParam;
480
+
481
+ }
482
+
483
+
484
+
485
+ // ウィンドウプロシージャ
486
+
487
+ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
488
+
489
+ {
490
+
491
+ switch(msg)
492
+
493
+ {
494
+
495
+ case WM_DESTROY:
496
+
497
+ PostQuitMessage(0);
498
+
499
+ break;
500
+
501
+ default:
502
+
503
+ return (DefWindowProc(hWnd, msg, wParam, lParam));
504
+
505
+ }
506
+
507
+
508
+
509
+ return (0L);
510
+
511
+ }
512
+
513
+
514
+
515
+ void screenSaver(HWND hWnd)
516
+
517
+ {
518
+
519
+ // 元のデスクトップハンドルを退避
520
+
521
+ HDESK hdesk_old = GetThreadDesktop(GetCurrentThreadId());
522
+
523
+ // スクリーンセーバーのデスクトップを開く
524
+
525
+ // HDESK hdesk = OpenDesktop(L"Screen-saver", 0, FALSE, GENERIC_ALL);
526
+
527
+ HDESK hdesk = OpenDesktop("Screen-saver", 0, FALSE, GENERIC_ALL);
528
+
529
+ if( hdesk != NULL )
530
+
531
+ {
532
+
533
+ // 現在のスレッドのデスクトップを変更
534
+
535
+ SetThreadDesktop(hdesk);
536
+
537
+ }
538
+
539
+ // スクリーンセーバー解除処理
540
+
541
+ keybd_event(VK_ESCAPE, 0, 0, 0);
542
+
543
+ keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
544
+
545
+
546
+
547
+ // 元のデスクトップに戻す
548
+
549
+ SetThreadDesktop(hdesk_old);
550
+
551
+ if( hdesk != NULL )
552
+
553
+ {
554
+
555
+ CloseDesktop(hdesk);
556
+
557
+ }
558
+
559
+
560
+
561
+ }
562
+
563
+
564
+
565
+ ```