質問編集履歴
2
困っていることの変更,ソースコードの追記と変更
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
|
-
|
24
|
-
|
25
|
-
|
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 "
|
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
|
-
|
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 *)&screen
|
175
|
+
SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
|
156
|
-
|
176
|
+
|
157
|
-
if( screen
|
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
|
-
|
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 screen
|
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 <
|
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(
|
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
|
-
// S
|
557
|
+
// ウィンドウを作成するとSetThreadDesktopできないのでスレッドを起動する.
|
470
|
-
|
471
|
-
|
558
|
+
|
472
|
-
|
473
|
-
screenSaver
|
559
|
+
_beginthread(screenSaver, 0, NULL);
|
474
560
|
|
475
561
|
}
|
476
562
|
|
@@ -512,7 +598,7 @@
|
|
512
598
|
|
513
599
|
|
514
600
|
|
515
|
-
void screenSaver(
|
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
困っていること,確認したこと,ソースコードの修正,
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,35 +6,49 @@
|
|
6
6
|
|
7
7
|
### 困っていること
|
8
8
|
|
9
|
-
現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
33
|
+
~~1. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)~~
|
20
|
-
|
34
|
+
|
21
|
-
|
35
|
+
~~2. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.~~
|
22
|
-
|
36
|
+
|
23
|
-
|
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
|
-
|
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
|
-
|
219
|
+
|
160
220
|
|
161
221
|
|
162
222
|
|
@@ -244,7 +304,11 @@
|
|
244
304
|
|
245
305
|
bool screenSaver;
|
246
306
|
|
247
|
-
|
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
|
+
```
|