Что такое WinAPI? Это функции, грубо говоря, встроенные в Windows. Большинство из них описаны в файле Windows.pas. Этот файл подключается по умолчанию каждый раз, когда ты создаёшь новый проект, поэтому тебе не нужны дополнительные действия для использования этих функций. Все функции WinAPI я рассказать не в состоянии, потому что их тысячи, но мы будет потихонечку знакомится с наиболее интересными из них.
Примеры к этим функциям я давать не буду. Если ты внимательно читал предыдущие номера и внимательно прочтёшь эту статью, то никаких проблем с реализацией у тебя не возникнет. Тем более, что я уже использовал WinAPI, когда писал статью про нестандартные окна в 5-м номере 2000г. Итак, меньше болтовни а больше дела.
function ExitWindowsEx(
Code: Word;
dwReserved: DWORD;
): BOOL;
Первый параметр может принимать следующие значения:
EWX_FORCE Закрытие Windows без предупреждения. Если использовать этот флаг, то запущенные приложения не получат сообщения о закрытии и могут потерять данные. Используй этот флаг только в аварийных ситуациях.
EWX_LOGOFF Это тоже самое, что и завершение сеанса. Все приложения будут закрыты и появиться приглашение войти в систему под новым именем.
EWX_POWEROFF Выключить компьютер. Функция с этим флагом работает не на всех компьютерах, а только на тех, которые поддерживают автоматическое отключение питания.
EWX_REBOOT Перезагрузить компьютер
EWX_SHUTDOWN Завершение работы Windows без отключения питания у компьютера.
Второй параметр зарезервирован и игнорируется. Для совместимости с будущими версиями лучше ставить ноль.
Вот и всё, теперь ты сможешь выключать компьютер из своей программы. Теперь перейдём к режиму энергосбережения. Зачем это нужно? Например, мемед не умеет выводить компьютер из состояния каматоза, поэтому об этом можем позаботиться мы.
Как видишь, функция одна, просто они отличаются только последним параметром.
Теперь давай рассмотрим не менее интересную проблему - запуск только одной копии проги. Для этого мы опять же будем использовать WinAPI.
Весь код будем писать в DPR файле проекта. Чтобы его вызвать, нужно выбрать Project Maneger из меню View . Теперь щёлкни правой кнопкой мышки по имени проекта. Перед тобой откроется меню, как на рисунке 1. Выбери в этом меню пункт View Source . Вот какой текст ты должен в нём написать:
program Project1;
uses
Forms,Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
var
hwin:HWND;
begin
hwin:=FindWindow('TForm1','Hallo World!!!');
if hwin<>0 then
begin
SetForegroundWindow(hwin);
Application.Terminate;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Давай рассмотрим самые интересные вещи. Первая API функция, которую я использую - FindWindow. Эта функция ищет окно по имени объекта окна (первый параметр) и заголовка окна (второй параметр). Если в качестве заголовка передать NIL, то будет найдено первое окно с таким именем объекта. Функция возвращает указатель на окно.
После вызова этой функции я проверяю, было ли найдено какое-нибудь окно. Если нет, то программа продолжит загрузку. Если да то вызывается функция SetForegroundWindow, которая делает активным найденное окно. В качестве параметра передаётся указатель на окошко. После этого программа прерывается с помощью Application.Terminate . Это не нормальное прерывание программы. Я его использую только потому, что уверен, что никаких действий по инициализации ещё не произошло. Я не советую тебе использовать эту функцию в других случаях. Я бы и здесь не использовал её, просто нет другого выхода, потому что ещё не запущено приложение, и прерывать больше нечего.
Это самый простейший и достаточно эффективный способ проверки на запуск второй копии. Совсем забыл, в файле DPR по умолчанию не подключается файл Windows, поэтому ты должен сам дописать его в раздел USES вначале проекта, как это сделал я.
Вот и всё. Как видишь, WinAPI используются так же, как и любые другие функции Delphi. На сегодня всё. Первое знакомство с WinAPI закончено, но в будущем мы ещё будем встречаться с этими функциями. Удачи тебе.