Русская документация для фриланесеров
Главная arrow Delphi arrow Работа с WinAPI в Delphi  
21.11.2008 г.
Главное меню
Главная
Поиск
PHP
.NET
Java
Ruby
C++
Delphi
Другие языки
Базы данных
Безопасность
Сети
ОС
Мобильные
Теория дизайна
WEB
Разное
Админцентр



. Бытовая техника. стиральные машины - Fotomag . Магазин Fotomag. Услуги: перевозка грузов на газели в Екатеринбурге. Русский каталог товаров, сайтов и фирм в Германии. бизнес семинары. Шины

Работа с WinAPI в Delphi Печать E-mail
Автор Westry   
13.12.2007 г.
Что такое 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 закончено, но в будущем мы ещё будем встречаться с этими функциями. Удачи тебе.

http://www.rtfm.4hack.com/articles.php?id1=2&id2=114 

 
« Пред.   След. »
Webdesign by Webmedie.dk Webdesign by Webmedie.dk