VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Язык программирования Delphi.
Работа с WinAPI
:
Logo

Что такое 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 без отключения питания у компьютера.

Второй параметр зарезервирован и игнорируется. Для совместимости с будущими версиями лучше ставить ноль.

Вот и всё, теперь ты сможешь выключать компьютер из своей программы. Теперь перейдём к режиму энергосбережения. Зачем это нужно? Например, мемед не умеет выводить компьютер из состояния каматоза, поэтому об этом можем позаботиться мы.

Выключение монитора:

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

Включение монитора:

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1); 
Logo
Рис 1. Project Manager

Как видишь, функция одна, просто они отличаются только последним параметром.

Теперь давай рассмотрим не менее интересную проблему - запуск только одной копии проги. Для этого мы опять же будем использовать 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 закончено, но в будущем мы ещё будем встречаться с этими функциями. Удачи тебе.


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©