📄 screensaver.c
字号:
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Display Control Panel
* FILE: dll/cpl/desk/screensaver.c
* PURPOSE: Screen saver property page
*
* PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
* Ged Murphy (gedmurphy@reactos.org)
*/
#include "desk.h"
#define MAX_SCREENSAVERS 100
typedef struct
{
BOOL bIsScreenSaver; /* Is this background a wallpaper */
TCHAR szFilename[MAX_PATH];
TCHAR szDisplayName[256];
} ScreenSaverItem;
typedef struct _GLOBAL_DATA
{
ScreenSaverItem ScreenSaverItems[MAX_SCREENSAVERS];
PROCESS_INFORMATION PrevWindowPi;
int Selection;
} GLOBAL_DATA, *PGLOBAL_DATA;
static LPTSTR
GetCurrentScreenSaverValue(LPTSTR lpValue)
{
HKEY hKey;
LPTSTR lpBuf = NULL;
DWORD BufSize, Type = REG_SZ;
LONG Ret;
Ret = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop"),
0,
KEY_READ,
&hKey);
if (Ret != ERROR_SUCCESS)
return NULL;
Ret = RegQueryValueEx(hKey,
lpValue,
0,
&Type,
NULL,
&BufSize);
if (Ret == ERROR_SUCCESS)
{
lpBuf = HeapAlloc(GetProcessHeap(),
0,
BufSize);
if (lpBuf)
{
Ret = RegQueryValueEx(hKey,
lpValue,
0,
&Type,
(LPBYTE)lpBuf,
&BufSize);
if (Ret != ERROR_SUCCESS)
lpBuf = NULL;
}
}
RegCloseKey(hKey);
return lpBuf;
}
static VOID
SelectionChanged(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
HWND hwndCombo;
BOOL bEnable;
INT i;
hwndCombo = GetDlgItem(hwndDlg, IDC_SCREENS_LIST);
i = (INT)SendMessage(hwndCombo, CB_GETCURSEL, 0, 0);
i = (INT)SendMessage(hwndCombo, CB_GETITEMDATA, i, 0);
pGlobalData->Selection = i;
bEnable = (i != 0);
EnableWindow(GetDlgItem(hwndDlg, IDC_SCREENS_SETTINGS), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_SCREENS_TESTSC), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_SCREENS_USEPASSCHK), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_SCREENS_TIMEDELAY), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_SCREENS_TIME), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_WAITTEXT), bEnable);
EnableWindow(GetDlgItem(hwndDlg, IDC_MINTEXT), bEnable);
}
static VOID
SetScreenSaverPreviewBox(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
HWND hPreview = GetDlgItem(hwndDlg, IDC_SCREENS_PREVIEW);
STARTUPINFO si;
TCHAR szCmdline[2048];
/* kill off the previous preview process*/
if (pGlobalData->PrevWindowPi.hProcess)
{
TerminateProcess(pGlobalData->PrevWindowPi.hProcess, 0);
CloseHandle(pGlobalData->PrevWindowPi.hProcess);
CloseHandle(pGlobalData->PrevWindowPi.hThread);
pGlobalData->PrevWindowPi.hThread = pGlobalData->PrevWindowPi.hProcess = NULL;
}
if (pGlobalData->Selection > 0)
{
_stprintf(szCmdline,
_T("%s /p %u"),
pGlobalData->ScreenSaverItems[pGlobalData->Selection].szFilename,
hPreview);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pGlobalData->PrevWindowPi, sizeof(pGlobalData->PrevWindowPi));
if (!CreateProcess(NULL,
szCmdline,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pGlobalData->PrevWindowPi))
{
pGlobalData->PrevWindowPi.hThread = pGlobalData->PrevWindowPi.hProcess = NULL;
}
}
}
static BOOL
WaitForSettingsDialog(HWND hwndDlg,
HANDLE hProcess)
{
while (TRUE)
{
DWORD Ret;
MSG msg;
while (PeekMessage(&msg,
NULL,
0,
0,
PM_REMOVE))
{
if (msg.message == WM_QUIT)
return FALSE;
if (IsDialogMessage(hwndDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Ret = MsgWaitForMultipleObjects(1,
&hProcess,
FALSE,
INFINITE,
QS_ALLINPUT);
if (Ret == (WAIT_OBJECT_0))
{
return TRUE;
}
}
}
static VOID
ScreensaverConfig(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
/*
/c:<hwnd> Run configuration, hwnd is handle of calling window
*/
TCHAR szCmdline[2048];
STARTUPINFO si;
PROCESS_INFORMATION pi;
if (pGlobalData->Selection < 1)
return;
_stprintf(szCmdline,
_T("%s /c:%u"),
pGlobalData->ScreenSaverItems[pGlobalData->Selection].szFilename,
hwndDlg);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if(CreateProcess(NULL,
szCmdline,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
/* kill off the previous preview process */
if (pGlobalData->PrevWindowPi.hProcess)
{
TerminateProcess(pGlobalData->PrevWindowPi.hProcess, 0);
CloseHandle(pGlobalData->PrevWindowPi.hProcess);
CloseHandle(pGlobalData->PrevWindowPi.hThread);
pGlobalData->PrevWindowPi.hThread = pGlobalData->PrevWindowPi.hProcess = NULL;
}
if (WaitForSettingsDialog(hwndDlg, pi.hProcess))
SetScreenSaverPreviewBox(hwndDlg, pGlobalData);
}
}
static VOID
ScreensaverPreview(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
/*
/s Run normal
*/
WCHAR szCmdline[2048];
STARTUPINFO si;
PROCESS_INFORMATION pi;
if (pGlobalData->Selection < 1)
return;
/* kill off the previous preview process*/
if (pGlobalData->PrevWindowPi.hProcess)
{
TerminateProcess(pGlobalData->PrevWindowPi.hProcess, 0);
CloseHandle(pGlobalData->PrevWindowPi.hProcess);
CloseHandle(pGlobalData->PrevWindowPi.hThread);
pGlobalData->PrevWindowPi.hThread = pGlobalData->PrevWindowPi.hProcess = NULL;
}
_stprintf(szCmdline,
_T("%s /s"),
pGlobalData->ScreenSaverItems[pGlobalData->Selection].szFilename);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if(CreateProcess(NULL,
szCmdline,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
static VOID
CheckRegScreenSaverIsSecure(HWND hwndDlg)
{
HKEY hKey;
TCHAR szBuffer[2];
DWORD bufferSize = sizeof(szBuffer);
DWORD varType = REG_SZ;
LONG result;
if (RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop"),
0,
KEY_ALL_ACCESS,
&hKey) == ERROR_SUCCESS)
{
result = RegQueryValueEx(hKey,
_T("ScreenSaverIsSecure"),
0,
&varType,
(LPBYTE)szBuffer,
&bufferSize);
RegCloseKey(hKey);
if (result == ERROR_SUCCESS)
{
if (_ttoi(szBuffer) == 1)
{
SendDlgItemMessage(hwndDlg,
IDC_SCREENS_USEPASSCHK,
BM_SETCHECK,
(WPARAM)BST_CHECKED,
0);
return;
}
}
SendDlgItemMessage(hwndDlg,
IDC_SCREENS_USEPASSCHK,
BM_SETCHECK,
(WPARAM)BST_UNCHECKED,
0);
}
}
static VOID
AddScreenSavers(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
HWND hwndScreenSavers = GetDlgItem(hwndDlg, IDC_SCREENS_LIST);
WIN32_FIND_DATA fd;
HANDLE hFind;
TCHAR szSearchPath[MAX_PATH];
INT i;
int ScreenSaverCount = 0;
ScreenSaverItem *ScreenSaverItem = NULL;
HANDLE hModule = NULL;
/* Add the "None" item */
ScreenSaverItem = &pGlobalData->ScreenSaverItems[ScreenSaverCount];
ScreenSaverItem->bIsScreenSaver = FALSE;
LoadString(hApplet,
IDS_NONE,
ScreenSaverItem->szDisplayName,
sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR));
i = SendMessage(hwndScreenSavers,
CB_ADDSTRING,
0,
(LPARAM)ScreenSaverItem->szDisplayName);
SendMessage(hwndScreenSavers,
CB_SETITEMDATA,
i,
(LPARAM)ScreenSaverCount);
ScreenSaverCount++;
/* Add all the screensavers in the C:\ReactOS\System32 directory. */
GetSystemDirectory(szSearchPath, MAX_PATH);
_tcscat(szSearchPath, TEXT("\\*.scr"));
hFind = FindFirstFile(szSearchPath, &fd);
while (ScreenSaverCount < MAX_SCREENSAVERS-1 &&
hFind != INVALID_HANDLE_VALUE)
{
/* Don't add any hidden screensavers */
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -