2 Screen saver library by Anders Norlander <anorland@hem2.passagen.se>
4 This library is (hopefully) compatible with Microsoft's
7 This is public domain software.
15 /* screen saver window class */
16 #define CLASS_SCRNSAVE TEXT("WindowsScreenSaverClass")
19 HWND hMainWindow
= NULL
;
20 BOOL fChildPreview
= FALSE
;
21 HINSTANCE hMainInstance
;
22 TCHAR szName
[TITLEBARNAMELEN
];
23 TCHAR szAppName
[APPNAMEBUFFERLEN
];
24 TCHAR szIniFile
[MAXFILELEN
];
25 TCHAR szScreenSaver
[22];
26 TCHAR szHelpFile
[MAXFILELEN
];
27 TCHAR szNoHelpMemory
[BUFFLEN
];
30 /* local house keeping */
31 static HINSTANCE hPwdLib
= NULL
;
33 static BOOL checking_pwd
= FALSE
;
34 static BOOL closing
= FALSE
;
35 static BOOL w95
= FALSE
;
37 typedef BOOL (WINAPI
*VERIFYPWDPROC
)(HWND
);
38 typedef DWORD (WINAPI
*CHPWDPROC
)(LPCTSTR
, HWND
, DWORD
, PVOID
);
39 static VERIFYPWDPROC VerifyScreenSavePwd
= NULL
;
42 #define szVerifyPassword "VerifyScreenSavePwd"
45 #define szPwdChangePassword "PwdChangePasswordW"
47 #define szPwdChangePassword "PwdChangePasswordA"
50 static void TerminateScreenSaver(HWND hWnd
);
51 static BOOL
RegisterClasses(void);
52 static LRESULT WINAPI
SysScreenSaverProc(HWND
,UINT
,WPARAM
,LPARAM
);
53 static int LaunchScreenSaver(HWND hParent
);
54 static void LaunchConfig(void);
56 static int ISSPACE(char c
)
58 return (c
== ' ' || c
== '\t');
61 #define ISNUM(c) ((c) >= '0' && c <= '9')
77 for (n
= 1; p
>= s
; p
--, n
*= 10)
78 res
+= (*p
- '0') * n
;
83 /* screen saver entry point */
84 int APIENTRY
WinMain(HINSTANCE hInst
, HINSTANCE hPrevInst
,
85 LPSTR CmdLine
, int nCmdShow
)
91 hMainInstance
= hInst
;
93 vi
.dwOSVersionInfoSize
= sizeof(vi
);
95 /* check if we are going to check for passwords */
96 if (vi
.dwPlatformId
== VER_PLATFORM_WIN32_WINDOWS
)
99 /* we are using windows 95 */
101 if (RegOpenKey(HKEY_CURRENT_USER
, REGSTR_PATH_SCREENSAVE
,&hKey
) ==
105 DWORD size
= sizeof(DWORD
);
109 res
= RegQueryValueEx(hKey
, REGSTR_VALUE_USESCRPASSWORD
,
110 NULL
, &type
, (PBYTE
) &check_pwd
, &size
);
112 if (check_pwd
&& res
== ERROR_SUCCESS
)
114 hPwdLib
= LoadLibrary(TEXT("PASSWORD.CPL"));
116 VerifyScreenSavePwd
= GetProcAddress(hPwdLib
, szVerifyPassword
);
123 /* parse arguments */
124 for (p
= CmdLine
; *p
; p
++)
130 /* start screen saver */
131 return LaunchScreenSaver(NULL
);
136 /* start screen saver in preview window */
138 fChildPreview
= TRUE
;
140 while (ISSPACE(*++p
));
141 hParent
= (HWND
) _toul(p
);
143 if (hParent
&& IsWindow(hParent
))
144 return LaunchScreenSaver(hParent
);
150 /* display configure dialog */
157 /* change screen saver password */
159 while (ISSPACE(*++p
));
160 hParent
= (HWND
) _toul(p
);
162 if (!hParent
|| !IsWindow(hParent
))
163 hParent
= GetForegroundWindow();
165 ScreenSaverChangePassword(hParent
);
182 static void LaunchConfig(void)
184 /* FIXME: should this be called */
185 RegisterDialogClasses(hMainInstance
);
187 /* display configure dialog */
188 DialogBox(hMainInstance
, MAKEINTRESOURCE(DLG_SCRNSAVECONFIGURE
),
189 GetForegroundWindow(), (DLGPROC
) ScreenSaverConfigureDialog
);
192 static int LaunchScreenSaver(HWND hParent
)
199 /* don't allow other tasks to get into the foreground */
200 if (w95
&& !fChildPreview
)
201 SystemParametersInfo(SPI_SCREENSAVERRUNNING
, TRUE
, &foo
, 0);
205 /* register classes, both user defined and classes used by screen saver
207 if (!RegisterClasses())
209 MessageBox(NULL
, TEXT("RegisterClasses() failed"), NULL
, MB_ICONHAND
);
213 /* a slightly different approach needs to be used when displaying
214 in a preview window */
218 GetClientRect(hParent
, &rc
);
223 rc
.right
= GetSystemMetrics(SM_CXSCREEN
);
224 rc
.bottom
= GetSystemMetrics(SM_CYSCREEN
);
228 /* create main screen saver window */
229 hMainWindow
= CreateWindowEx(hParent
? 0 : WS_EX_TOPMOST
, CLASS_SCRNSAVE
,
230 TEXT("SCREENSAVER"), style
,
231 0, 0, rc
.right
, rc
.bottom
, hParent
, NULL
,
232 hMainInstance
, NULL
);
234 /* display window and start pumping messages */
237 UpdateWindow(hMainWindow
);
238 ShowWindow(hMainWindow
, SW_SHOW
);
240 while (GetMessage(&msg
, NULL
, 0, 0) == TRUE
)
242 TranslateMessage(&msg
);
243 DispatchMessage(&msg
);
249 if (w95
&& !fChildPreview
)
250 SystemParametersInfo(SPI_SCREENSAVERRUNNING
, FALSE
, &foo
, 0);
252 FreeLibrary(hPwdLib
);
256 /* this function takes care of *must* do tasks, like terminating
258 static LRESULT WINAPI
SysScreenSaverProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
265 /* mouse is not supposed to move from this position */
266 GetCursorPos(&pt_orig
);
280 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);
307 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);
312 return ScreenSaverProc(hWnd
, msg
, wParam
, lParam
);
315 LONG WINAPI
DefScreenSaverProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
317 /* don't do any special processing when in preview mode */
318 if (fChildPreview
|| closing
)
319 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);
324 TerminateScreenSaver(hWnd
);
325 /* do NOT pass this to DefWindowProc; it will terminate even if
326 an invalid password was given.
331 /* verify password or return TRUE if password checking is turned off */
332 if (VerifyScreenSavePwd
)
333 return VerifyScreenSavePwd(hWnd
);
353 if (pt
.x
== pt_orig
.x
&& pt
.y
== pt_orig
.y
)
362 /* try to terminate screen saver */
364 PostMessage(hWnd
, WM_CLOSE
, 0, 0);
368 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);
371 static void TerminateScreenSaver(HWND hWnd
)
373 /* don't allow recursion */
374 if (checking_pwd
|| closing
)
377 /* verify password */
378 if (VerifyScreenSavePwd
)
381 closing
= SendMessage(hWnd
, SCRM_VERIFYPW
, 0, 0);
382 checking_pwd
= FALSE
;
387 /* are we closing? */
393 GetCursorPos(&pt_orig
); /* if not: get new mouse position */
397 Register screen saver window class and call user
400 static BOOL
RegisterClasses(void)
403 ZeroMemory(&cls
, sizeof(cls
));
405 cls
.hIcon
= LoadIcon(hMainInstance
, MAKEINTATOM(ID_APP
));
406 cls
.lpszMenuName
= NULL
;
407 cls
.lpszClassName
= CLASS_SCRNSAVE
;
408 cls
.hbrBackground
= NULL
; //(HBRUSH)GetStockObject(BLACK_BRUSH);
409 cls
.hInstance
= hMainInstance
;
410 cls
.style
= CS_VREDRAW
| CS_HREDRAW
| CS_SAVEBITS
| CS_PARENTDC
;
411 cls
.lpfnWndProc
= (WNDPROC
) SysScreenSaverProc
;
415 if (!RegisterClass(&cls
))
418 return RegisterDialogClasses(hMainInstance
);
421 void WINAPI
ScreenSaverChangePassword(HWND hParent
)
423 /* load Master Password Router (MPR) */
424 HINSTANCE hMpr
= LoadLibrary(TEXT("MPR.DLL"));
428 CHPWDPROC ChangePassword
;
429 ChangePassword
= (CHPWDPROC
) GetProcAddress(hMpr
, szPwdChangePassword
);
431 /* change password for screen saver provider */
433 ChangePassword(TEXT("SCRSAVE"), hParent
, 0, NULL
);