質問編集履歴
2
困っていることの変更,ソースコードの追記と変更
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
|
-
|
12
|
+
~~1. whileの中で「screenSaver」のみをコールした時はスクリーンセーバー抑止を確認.~~
|
13
|
-
|
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 "
|
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
|
-
|
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 *)&
|
88
|
+
SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, (void *)&screensaver, 0);
|
79
|
-
if(
|
89
|
+
if( screensaver == true)
|
80
90
|
{
|
91
|
+
// 5秒後(周期は500ms)
|
81
92
|
if( cnt >= 10 )
|
82
93
|
{
|
83
|
-
//
|
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
|
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 <
|
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(
|
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
|
-
//
|
279
|
+
// ウィンドウを作成するとSetThreadDesktopできないのでスレッドを起動する.
|
236
|
-
// スクリーンセーバーはかかるがスクリーンセーバーが解除されない.
|
237
|
-
|
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(
|
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
困っていること,確認したこと,ソースコードの修正,
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,21 +2,28 @@
|
|
2
2
|
「スクリーンセーバーがかかっている」かつ「フラグがON」のとき,「スクリーンセーバーを解除したい」です.
|
3
3
|
|
4
4
|
### 困っていること
|
5
|
-
現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.
|
5
|
+
~~現状,スクリーンセーバーの状態取得は「SystemParametersInfo」で,スクリーンセーバーの解除方法を下記二つで試しましたが,解除されなくて困っています.~~
|
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であるから大丈夫なのではないでしょうか?ご教授お願いいたします.
|
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
|
-
|
17
|
+
~~1. 「keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0 );」にbreakを貼ってスクリーンセーバー後,5秒待っても解除されない(その後,マウスを動かしてスクリーンセーバーを解除.breakを貼った個所に処理が到達していることを確認.)~~
|
11
|
-
|
18
|
+
~~2. 1ではbreak時にまだ「keybd_event」処理を実行していないからその下の「ShowMessage("スクリーンセーバー解除したよ");」にbreakに貼ってスクリーンセーバー後,5秒待っても解除されない.~~
|
12
|
-
|
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
|
-
|
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
|
-
|
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
|
```
|