📄 screensaver.c
字号:
{
TCHAR filename[MAX_PATH];
GetSystemDirectory(filename, MAX_PATH);
_tcscat(filename, TEXT("\\"));
_tcscat(filename, fd.cFileName);
ScreenSaverItem = &pGlobalData->ScreenSaverItems[ScreenSaverCount];
ScreenSaverItem->bIsScreenSaver = TRUE;
hModule = LoadLibraryEx(filename,
NULL,
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
if (hModule)
{
LoadString(hModule,
1,
ScreenSaverItem->szDisplayName,
sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR));
FreeLibrary(hModule);
}
else
{
_tcscpy(ScreenSaverItem->szDisplayName, _T("Unknown"));
}
_tcscpy(ScreenSaverItem->szFilename, filename);
i = SendMessage(hwndScreenSavers,
CB_ADDSTRING,
0,
(LPARAM)ScreenSaverItem->szDisplayName);
SendMessage(hwndScreenSavers,
CB_SETITEMDATA,
i,
(LPARAM)ScreenSaverCount);
ScreenSaverCount++;
}
if (!FindNextFile(hFind, &fd))
hFind = INVALID_HANDLE_VALUE;
}
}
static VOID
SetScreenSaver(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
HKEY regKey;
if (RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop"),
0,
KEY_ALL_ACCESS,
®Key) == ERROR_SUCCESS)
{
INT Time;
BOOL bRet;
TCHAR szTime[256], Sec;
UINT Ret;
/* set the screensaver */
if (pGlobalData->ScreenSaverItems[pGlobalData->Selection].bIsScreenSaver)
{
RegSetValueEx(regKey,
_T("SCRNSAVE.EXE"),
0,
REG_SZ,
(PBYTE)pGlobalData->ScreenSaverItems[pGlobalData->Selection].szFilename,
_tcslen(pGlobalData->ScreenSaverItems[pGlobalData->Selection].szFilename) * sizeof(TCHAR));
}
else
{
/* Windows deletes the value if no screensaver is set */
RegDeleteValue(regKey, _T("SCRNSAVE.EXE"));
}
/* set the screensaver time delay */
Time = GetDlgItemInt(hwndDlg,
IDC_SCREENS_TIMEDELAY,
&bRet,
FALSE);
if (Time == 0)
Time = 60;
else
Time *= 60;
_itot(Time, szTime, 10);
RegSetValueEx(regKey,
_T("ScreenSaveTimeOut"),
0,
REG_SZ,
(PBYTE)szTime,
_tcslen(szTime) * sizeof(TCHAR));
/* set the secure value */
Ret = SendDlgItemMessage(hwndDlg,
IDC_SCREENS_USEPASSCHK,
BM_GETCHECK,
0,
0);
Sec = (Ret == BST_CHECKED) ? _T('1') : _T('0');
RegSetValueEx(regKey,
_T("ScreenSaverIsSecure"),
0,
REG_SZ,
(PBYTE)&Sec,
sizeof(TCHAR));
RegCloseKey(regKey);
}
}
static BOOL
OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
LPTSTR lpCurSs;
HWND hwndSSCombo = GetDlgItem(hwndDlg, IDC_SCREENS_LIST);
INT Num;
pGlobalData = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(GLOBAL_DATA));
if (!pGlobalData)
{
EndDialog(hwndDlg, -1);
return FALSE;
}
SetWindowLongPtr(hwndDlg,
DWLP_USER,
(LONG_PTR)pGlobalData);
pGlobalData->Selection = -1;
SendDlgItemMessage(hwndDlg,
IDC_SCREENS_TIME,
UDM_SETRANGE,
0,
MAKELONG
((short) 240, (short) 1));
AddScreenSavers(hwndDlg,
pGlobalData);
CheckRegScreenSaverIsSecure(hwndDlg);
/* set the current screensaver in the combo box */
lpCurSs = GetCurrentScreenSaverValue(_T("SCRNSAVE.EXE"));
if (lpCurSs)
{
BOOL bFound = FALSE;
INT i;
for (i = 0; i < MAX_SCREENSAVERS; i++)
{
if (!_tcscmp(lpCurSs, pGlobalData->ScreenSaverItems[i].szFilename))
{
bFound = TRUE;
break;
}
}
if (bFound)
{
Num = SendMessage(hwndSSCombo,
CB_FINDSTRINGEXACT,
-1,
(LPARAM)pGlobalData->ScreenSaverItems[i].szDisplayName);
if (Num != CB_ERR)
SendMessage(hwndSSCombo,
CB_SETCURSEL,
Num,
0);
}
else
{
SendMessage(hwndSSCombo,
CB_SETCURSEL,
0,
0);
}
HeapFree(GetProcessHeap(),
0,
lpCurSs);
}
else
{
/* set screensaver to (none) */
SendMessage(hwndSSCombo,
CB_SETCURSEL,
0,
0);
}
/* set the current timeout */
lpCurSs = GetCurrentScreenSaverValue(_T("ScreenSaveTimeOut"));
if (lpCurSs)
{
UINT Time = _ttoi(lpCurSs);
Time /= 60;
SendDlgItemMessage(hwndDlg,
IDC_SCREENS_TIME,
UDM_SETPOS32,
0,
Time);
HeapFree(GetProcessHeap(),
0,
lpCurSs);
}
SelectionChanged(hwndDlg,
pGlobalData);
return TRUE;
}
INT_PTR CALLBACK
ScreenSaverPageProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PGLOBAL_DATA pGlobalData;
pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
{
OnInitDialog(hwndDlg, pGlobalData);
break;
}
case WM_DESTROY:
{
if (pGlobalData->PrevWindowPi.hProcess)
{
TerminateProcess(pGlobalData->PrevWindowPi.hProcess, 0);
CloseHandle(pGlobalData->PrevWindowPi.hProcess);
CloseHandle(pGlobalData->PrevWindowPi.hThread);
}
HeapFree(GetProcessHeap(),
0,
pGlobalData);
break;
}
case WM_ENDSESSION:
{
SetScreenSaverPreviewBox(hwndDlg,
pGlobalData);
break;
}
case WM_COMMAND:
{
DWORD controlId = LOWORD(wParam);
DWORD command = HIWORD(wParam);
switch (controlId)
{
case IDC_SCREENS_LIST:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
SelectionChanged(hwndDlg, pGlobalData);
SetScreenSaverPreviewBox(hwndDlg, pGlobalData);
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
break;
}
case IDC_SCREENS_TIMEDELAY:
{
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
break;
}
case IDC_SCREENS_POWER_BUTTON: // Start Powercfg.Cpl
{
if (command == BN_CLICKED)
WinExec("rundll32 shell32.dll,Control_RunDLL powercfg.cpl",SW_SHOWNORMAL);
break;
}
case IDC_SCREENS_TESTSC: // Screensaver Preview
{
if(command == BN_CLICKED)
{
ScreensaverPreview(hwndDlg, pGlobalData);
SetScreenSaverPreviewBox(hwndDlg, pGlobalData);
}
break;
}
case IDC_SCREENS_SETTINGS: // Screensaver Settings
{
if (command == BN_CLICKED)
ScreensaverConfig(hwndDlg, pGlobalData);
break;
}
case IDC_SCREENS_USEPASSCHK: // Screensaver Is Secure
{
if (command == BN_CLICKED)
{
MessageBox(NULL, TEXT("Feature not yet implemented"), TEXT("Sorry"), MB_OK);
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
break;
}
}
break;
}
case WM_NOTIFY:
{
LPNMHDR lpnm = (LPNMHDR)lParam;
switch(lpnm->code)
{
case PSN_APPLY:
{
SetScreenSaver(hwndDlg, pGlobalData);
return TRUE;
}
case PSN_SETACTIVE:
{
/* activate screen saver support */
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDCHANGE);
SetScreenSaverPreviewBox(hwndDlg, pGlobalData);
break;
}
case PSN_KILLACTIVE:
{
/* Disable screensaver support */
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, FALSE, 0, SPIF_SENDCHANGE);
if (pGlobalData->PrevWindowPi.hProcess)
{
TerminateProcess(pGlobalData->PrevWindowPi.hProcess, 0);
CloseHandle(pGlobalData->PrevWindowPi.hProcess);
CloseHandle(pGlobalData->PrevWindowPi.hThread);
pGlobalData->PrevWindowPi.hThread = pGlobalData->PrevWindowPi.hProcess = NULL;
}
break;
}
}
}
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -