Как изменить размер шрифта в Windows NT и
перезагрузить её.
Автор: Arnon Mathias.
Компилятор: Visual C++ 6
Иногда необходимо, программным путём сделать
некоторые действия в операционной системе,
которые обычные пользователи делают чуть ли не
ежедневно.
Итак, прольём немного света на
недокументированные возможности.
Изменение больших шрифтов на маленькие и
обратно в Windows NT делается при помощи функции
SetupChangeFontSize в SysSetup.dll:
DWORD WINAPI SetupChangeFontSize( HANDLE HWindow,
LPCWSTR lpszFontSize)
Возвращаемые значения следующие:
ERROR_SUCCESS ( Value == 0 ) Операция завершена успешно.
ERROR_CANCELLED ( Value == 1223 ) Операция была прервана пользователем.
#include "windows.h"
///////////////////////////////////////////////////////////////
/// Arnon Mathias 13-Mar-2002
///////////////////////////////////////////////////////////////
DWORD _MyExitWindows(UINT ExitFlags)
{
/// Из документации MSDN по функции ExitWindowsEx
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwRetVal;
/// Получаем маркер (token) для этого процесса.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
::MessageBox (NULL,"Open Process Token","Exit Windows",MB_OK);
return (GetLastError());
}
/// Получаем LUID для привелегии выключения (shutdown).
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // устанавливаем привелегию "один"
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
/// Получаем привелегию выключения (shutdown) для этого процесса.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
/// Не получилось проверить возвращённое значение AdjustTokenPrivileges.
if ( (dwRetVal = GetLastError()) != ERROR_SUCCESS)
{
::MessageBox (NULL,"AdjustTokenPrivileges","Exit Windows",MB_OK);
return dwRetVal;
}
/// Выключаем или перезагружаем в соответствие с ExitFlags
::MessageBox ( NULL,
"Restarting Windows",
"System settings has changed",
MB_OK);
if (!ExitWindowsEx(ExitFlags, 0))
{
::MessageBox (NULL,
"Error While trying to exit",
"Exit Windows",
MB_OK);
return (GetLastError());
}
return ERROR_SUCCESS;
}
DWORD MyRestartWindows()
{
return _MyExitWindows(EWX_LOGOFF|EWX_REBOOT);
}
DWORD _MyChangeFontSize(unsigned short* lpszFontSize)
{
// строка размера шрифта должна быть в формате unicode
HMODULE hModule;
hModule = LoadLibrary("syssetup.dll");
if (hModule == NULL)
{
return (GetLastError());
}
typedef DWORD (WINAPI* MYPROC) (HANDLE,LPWSTR);
MYPROC ProcAdd;
ProcAdd = (MYPROC) GetProcAddress(hModule,
"SetupChangeFontSize");
if (ProcAdd == NULL)
{
return (GetLastError());
}
//////////////////////////////////////////////////////////////////
/// Изменение размера шрифта:
/// SetupChangeFontSize имеет на входе два параметра:
/// Дескриптор (Handle) вызывающего окна (я использую NULL)
/// строка размера шрифта в формате unicode:
/// L"120" для больших (Large) шрифтов
/// L"96" для маленьких (Small) шрифтов
/// SetupChangeFontSize вернёт 0 если операция прошла успешно.
DWORD dwRetVal;
dwRetVal = (ProcAdd) (NULL,lpszFontSize);
if (dwRetVal != ERROR_SUCCESS)
{
return dwRetVal;
}
////////////////////////////////////////////////////////////////
if ( !(FreeLibrary(hModule)) )
{
return (GetLastError());
}
return ERROR_SUCCESS;
}
void Change2LargeFonts()
{
DWORD dwRetVal = _MyChangeFontSize(L"120");
if (dwRetVal == ERROR_SUCCESS)
{
MyRestartWindows();
}
}
void Change2SmallFonts()
{
DWORD dwRetVal = _MyChangeFontSize(L"96");
if (dwRetVal == ERROR_SUCCESS)
{
MyRestartWindows();
}
}
int main(int argc, char* argv[])
{
// Change2LargeFonts();
Change2SmallFonts();
return 0;
}
|