15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как изменить размер шрифта в 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;
}