📄 screensaver.c
字号:
/* $Id: screensaver.c 24836 2006-11-26 12:47:56Z ekohl $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Display Control Panel
* FILE: lib/cpl/desk/screensaver.c
* PURPOSE: Screen saver property page
*
* PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
*/
#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 g_ScreenSaverItems[MAX_SCREENSAVERS];
int ImageListSelection;
HMENU g_hPopupMenu;
} GLOBAL_DATA, *PGLOBAL_DATA;
static VOID
ListViewItemAreChanged(HWND hwndDlg, PGLOBAL_DATA pGlobalData, int itemIndex)
{
BOOL bEnable;
LV_ITEM lvItem;
lvItem.mask = LVIF_PARAM;
lvItem.iItem = itemIndex;
lvItem.iSubItem = 0;
if (!ListView_GetItem(GetDlgItem(hwndDlg, IDC_SCREENS_CHOICES), &lvItem))
return;
pGlobalData->ImageListSelection = lvItem.lParam;
bEnable = (lvItem.lParam != 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);
}
static VOID
ScreensaverConfig(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
/*
/p:<hwnd> Run in preview
/s Run normal
/c:<hwnd> Run configuration, hwnd is handle of calling window
/a Run change password
*/
WCHAR szCmdline[2048];
STARTUPINFO si;
PROCESS_INFORMATION pi;
if (pGlobalData->ImageListSelection < 1)
return;
swprintf(szCmdline, L"%s /c:%u",
pGlobalData->g_ScreenSaverItems[pGlobalData->ImageListSelection].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))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
static VOID
ScreensaverPreview(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
/*
/p:<hwnd> Run in preview
/s Run normal
/c:<hwnd> Run configuration, hwnd is handle of calling window
/a Run change password
*/
WCHAR szCmdline[2048];
STARTUPINFO si;
PROCESS_INFORMATION pi;
if (pGlobalData->ImageListSelection < 1)
return;
swprintf(szCmdline, L"%s /p",
pGlobalData->g_ScreenSaverItems[pGlobalData->ImageListSelection].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))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
static VOID
ScreensaverDelete(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
SHFILEOPSTRUCT fos;
if (pGlobalData->ImageListSelection < 1) // Can NOT delete anything :-)
return;
fos.hwnd = hwndDlg;
fos.wFunc = FO_DELETE;
fos.fFlags = 0;
fos.pFrom = pGlobalData->g_ScreenSaverItems[pGlobalData->ImageListSelection].szFilename;
SHFileOperationW(&fos);
}
static VOID
CheckRegScreenSaverIsSecure(HWND hwndDlg)
{
HKEY hKey;
TCHAR szBuffer[2];
DWORD bufferSize = sizeof(szBuffer);
DWORD varType = REG_SZ;
LONG result;
RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &hKey);
result = RegQueryValueEx(hKey, TEXT("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
AddListViewItems(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
HWND hwndScreenSaverList = GetDlgItem(hwndDlg, IDC_SCREENS_CHOICES);
WIN32_FIND_DATA fd;
HANDLE hFind;
TCHAR szSearchPath[MAX_PATH];
LV_ITEM listItem;
LV_COLUMN dummy;
RECT clientRect;
//HKEY regKey;
SHFILEINFO sfi;
HIMAGELIST himl;
HIMAGELIST hScreenShellImageList = NULL;
//TCHAR wallpaperFilename[MAX_PATH];
//DWORD bufferSize = sizeof(wallpaperFilename);
//DWORD varType = REG_SZ;
//LONG result;
UINT i = 0;
int ScreenlistViewItemCount = 0;
ScreenSaverItem *ScreenSaverItem = NULL;
HANDLE hModule = NULL;
GetClientRect(hwndScreenSaverList, &clientRect);
ZeroMemory(&dummy, sizeof(LV_COLUMN));
dummy.mask = LVCF_SUBITEM | LVCF_WIDTH;
dummy.iSubItem = 0;
dummy.cx = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL);
(void)ListView_InsertColumn(hwndScreenSaverList, 0, &dummy);
/* Add the "None" item */
ScreenSaverItem = &pGlobalData->g_ScreenSaverItems[ScreenlistViewItemCount];
ScreenSaverItem->bIsScreenSaver = FALSE;
LoadString(hApplet,
IDS_NONE,
ScreenSaverItem->szDisplayName,
sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR));
ZeroMemory(&listItem, sizeof(LV_ITEM));
listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
listItem.state = LVIS_SELECTED;
listItem.pszText = ScreenSaverItem->szDisplayName;
listItem.iImage = -1;
listItem.iItem = ScreenlistViewItemCount;
listItem.lParam = ScreenlistViewItemCount;
(void)ListView_InsertItem(hwndScreenSaverList, &listItem);
ListView_SetItemState(hwndScreenSaverList, ScreenlistViewItemCount, LVIS_SELECTED, LVIS_SELECTED);
ScreenlistViewItemCount++;
/* Add current screensaver if any */
/*
RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, ®Key);
result = RegQueryValueEx(regKey, TEXT("SCRNSAVE.EXE"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize);
if ((result == ERROR_SUCCESS) && (_tcslen(wallpaperFilename) > 0))
{
himl = (HIMAGELIST)SHGetFileInfo(wallpaperFilename,
0,
&sfi,
sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
SHGFI_DISPLAYNAME);
if (himl != NULL)
{
if (i++ == 0)
{
g_hScreenShellImageList = himl;
(void)ListView_SetImageList(g_hScreengroundList, himl, LVSIL_SMALL);
}
ScreenSaverItem = &g_ScreenSaverItems[g_ScreenlistViewItemCount];
ScreenSaverItem->bIsScreenSaver = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -