Пятница - 23.04.2021 - 08:18:45
9439
0
   Занимаюсь программированием уже пять лет. За эти годы, как говорится, немало «программисткой каши съел». Программирование - дело интересное и увлекательное, особенно когда оно является твоим хобби. По профессии я не программист, программирование изучал из книг, форумов. Но не взирая на это, мои программы живут, работают, помогают в работе на компьютере мне и другим людям. Много чего произошло за это время, много интересных находок, можно даже сказать - маленьких открытий (по крайней мере для меня), но не было у меня пивного дурмана, жаренных сосисок, забвения реальной жизни. С увененностью могу сказать, что программирование и алкогольный и табачный дурман - вещи не совместимые. Реальное программирование возможно только на ясную и трезвую голову. А мутной голове рождаются только мутные мысли и образы, которые выливаются в пошлость, разврат и безобразие.

   В этом разделе я планирую поделиться исходными текстами фрагментов моих программ, интересных моментов и функций. Добавляя их в свои программы, вы можете существенно ускорить и облегчить свою работу.

1. Выключение, перезагрузка, ждущий, спящий режим средствами Builder C++.
2. Горячие клавиши для неактивного окна.
3. Создание собственного таймера
4. Индикатор удаления файлов (с помощью внешней программы)
5. Индикатор удаления файлов (с помощью потока)
6. Перемещение вкладок TabControl (Drag&Drop).
7. Установка шрифтов в системе.
8. Является ли строка числом.
9. Графика.
10. Управление чужими программами.
11. Демо-пример базы данных.

Итак, начнем.

Урок 1. Программа «Выключение компьютера».

На основе нижеприведенного кода была написана программа «Боковая панель». Внешний вид ее можно просмотреть
здесь

Код функции:

bool shoot(bool reboot, bool force,bool sleepmode,bool rebootORsleep)
{
OSVERSIONINFO ver;
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&ver);
// в семействе NT для выключения необходимо иметь привилегию SE_SHUTDOWN_NAME
if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
NewState=(TOKEN_PRIVILEGES*)malloc(sizeof(TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); NewState->PrivilegeCount = 1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&NewState->Privileges[0].Luid);
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, NewState, NULL, NULL,NULL);
free(NewState);
CloseHandle(hToken);
} if(rebootORsleep)
{
//(0,0) - спящий режим
//(1,0) - ждущий режим
SetSystemPowerState(sleepmode,0);
return 0;
}
else //выключение и перезагрузка
{UINT mode = 0;
if (reboot)
mode += EWX_REBOOT; else
mode += EWX_POWEROFF;
if (force) mode += EWX_FORCE;
ExitWindowsEx(mode,0);
return 1;}
}

Функция у нас есть, напишем простенькую программу без всяких украшений, в которой реализуем наши знания. Программная среда C++Builder 2007, хотя можна и в любой другой версии С++Builderа .

1. На форму ложим пять компонентов: 1-Label и 4-Button.
2. Подписываем их соответственно и даем им осмысленные имена.

3. Объявляем нашу функцию в файле сср.
include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
bool shoot(bool reboot, bool force,bool sleepmode,bool rebootORsleep)
{
OSVERSIONINFO ver;
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&ver);
// в семействе NT для выключения необходимо иметь привилегию SE_SHUTDOWN_NAME
if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
NewState=(TOKEN_PRIVILEGES*)malloc(sizeof(TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); NewState->PrivilegeCount = 1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&NewState->Privileges[0].Luid);
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, NewState, NULL, NULL,NULL);
free(NewState);
CloseHandle(hToken);
} if(rebootORsleep)
{
//(0,0) - спящий режим
//(1,0) - ждущий режим
SetSystemPowerState(sleepmode,0);
return 0;
}
else //выключение и перезагрузка
{UINT mode = 0;
if (reboot)
mode += EWX_REBOOT; else
mode += EWX_POWEROFF;
if (force) mode += EWX_FORCE;
ExitWindowsEx(mode,0);
return 1;}
}

4. Теперь нам нужны такие переменные (объявляем их в файле h.):
private: // User declarations
bool CloseOrReboot,Force,Sleepmode,RebootORsleep;

5. Напоследок, пишем обработчик нажатия кнопок:
//один обработчик для четырех кнопок
void __fastcall TForm1::ButtonSleepClick(TObject *Sender)
{
String CloseMode[4]={"Выключение","Перезагрузка","Спящий","Ждущий"};
int i;
TButton *pBut=(TButton *)Sender;
if(pBut==ButtonClose)
{CloseOrReboot=0;
RebootORsleep=0;
i=0;}
else if(pBut==ButtonReBoot)
{CloseOrReboot=1;
RebootORsleep=0;
i=1;}
else if(pBut==ButtonSleep)
{RebootORsleep=1;
Sleepmode=0;
i=2;}
else if(pBut==ButtonExpectation)
{RebootORsleep=1;
Sleepmode=1;
i=3;}
Force=0; //режим форсиров выкл я не применяю, поэтому всегда 0
Label1->Caption=CloseMode[i];
shoot(CloseOrReboot,Force,Sleepmode,RebootORsleep);
}

6. Подведем итоги.
Перед вами готовая программа. Теперь можно одним нажатием мыши выключить, перезагрузить, перейти в спящий или ждущий режим. Кстати, поэксперементируя с параметрами функции SetSystemPowerState(sleepmode,0), можно добиться вызова окна «Смена пользователя». Но мне этого не надо - есть системные кнопки < Win+L >.
Вот, в принципе, и все.
На следующем уроке расскажу как выключить компьютер с помощью горячих клавиш.