А "без окон, без дверей"
по-английски будет "ноу Виндоус, ноу Гейтс"?
Выпуск № 28
Здравствуйте, уважаемые подписчики!
В результате сортировки писем, пришедших на адрес нашей рассылки, оказалось что подавляющее большинство, можно разделить на две группы. Одни просят ответа на конкретный вопрос. Причем вопрос настолько конкретен, как например "Как открывать CD-ROM", что просто вбив его в поисковик, можно найти ответ :).
Вторая группа бросается в иную крайность, задавая настолько общий вопрос, ответом на который могла бы быть программа экранов так на ...дцать.
 К сожалению второй группе помочь сложно, т.к. сесть и написать за вас искусственный интеллект, для посадки космических челноков, в условиях разреженной атмосферы, мне не позволяет моя природная скромность и занятость, к тому же у нас негласный договор с NASA, они не выпускают рассылку по Delphi, а я не программирую шаттлы :).
А вот первой группе товарищей, я буду мстить, маленькими ответами на их вопросы, прямо на страницах рассылки. И начну прямо с текущего номера, т.к. вопросы могут быть интересны многим начинающим. Ну и по вполне понятным причинам автора вопроса указывать не имеет смысла. Что бы с чистой совестью использовать в своих примерах функции API, мне прийдется немного рассказать о них.
В 25-м выпуске, я рассказывал как писать свои Dll, и не скрывал тот факт, что многое уже написано до нас, и лежит в Dll'ках самого Windows'а. У некоторых читателей возник вполне резонный вопрос, а как бы попользоваться щедротами Microsoft'a, ведь они так скрывают содержимое своих библиотек... А вот и не правда, это содержимое расписано и каталогизировано сотрудниками компании, и постоянно обновляется. Называется этот сборник MSDN. Нет желания смотреть точную расшифровку этой документации, поэтому для
себя я перевожу ее как MS-Microsoft, DN - документация. Хотя возможно, что буква "D" - расшифровывается независимо. Существует сие произведение, только в электронном виде, только на английском языке и доступно к свободному скачивания с сайта MS. Но хочу сразу пресечь ваши попытки броситься ЭТО качать, например версия стоящая на моем ПК, (от апреля 2003г.), весит 1,7Гб!!! Думаю пылу поубавилось :). Но мир не без добрых людей, интузязисты, переводят некоторые куски на русский, и пишут готовые строчки кода, для
использования в конкретных языках программирования. Конечно это далеко не полные наборы, зато понятные для начинающих. В сети их множество, а искать надо по фразам типа "скачать API для Delphi".
Для того что бы использовать эти функции, обычно необходимо знать ответ на три вопроса, в какой dll-ке она находится, какие переменные надо объявить что-бы передать ей, и получить от нее значения, ну и собственно как ее вызывать.
Если ответ на первый вопрос не указан в примере, есть надежда что используются модули, которые Delphi и так подключает. Приведу пример. Используем функцию FindWindow, т.е. "Найти окно". В качестве параметра ей передается название окна, а возвращает она так называемый Хендел окна, т.е. уникальный идентификатор, по которому Вы потом можете оперировать этим окном (например закрыть его :).
Создайте на форме кнопку, а в процедуру ее обработки поместите следующее:
var
H : HWND;
begin
H := FindWindow ('Notepad', Nil);
If H <> 0 then ShowMessage ('Есть Блокнот')
else ShowMessage ('Нет Блокнота')
end;
Думаю комментарии не нужны? Но если в двух словах, то нажатие на кнопку выдает сообщение, открыт ли в данный момент Блокнот. Конечно можно похулиганить, и заменить сообщение "ShowMessage ('Есть Блокнот')", на API функцию
PostMessage(H, WM_QUIT, 0, 0) При этом окно будет не только находиться но и "убиваться". Думаю в этом месте любители злых розыгрышей, радостно потерли руки... ведь вместо нажатия на кнопку можно поставить на форме таймер, и делать опрос каждые 10 минут, а форму сделать невидимой. Представляете человека, у которого его любимый пасьянс, ни слова не говоря, закрывается, когда победа уже так близка... Но Вы лучше этого не делайте, добрее надо быть. В данном примере мы использовали уже подключенные модули. Следующий пример: открыть/закрыть
CD-ROM, выполнить это можно при помощи функции "mciSendString" но здесь уже необходимо указать что находиться она в модуле MMSystem, для этого в Uses, помимо, того что там уже "напихал" сам Delphi, через запятую, добавляем MMSystem.
А дальше все просто, на две кнопки, вешаем функции:
mciSendString('Set cdaudio Door Open Wait', nil, 0, handle);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
Либо обходимся одной кнопкой, а в булевой переменной меняем 0/1, соответственно открыть/закрыть. Сразу хочу предостеречь от наступания на грабли, если у Вас CD-ROM'ов больше одного (включая виртуальные), то работать это будет только с тем чья буква младше. Т.е. если у Вас виртуальный CD-ROM сидит на букве "E:", а реальный на "R:", то Вы ничего не увидите т.к. "открывать" будете "Е:".
А иногда, в описании API функции, указывают конкретную dll, где она находиться. Например функция ShFormatDrive(), которую можно использовать для форматирования винта, находиться в Shell32.dll, в этом случае перед использованием, надо ее объявить, для указанной функции это делается так:
function SHFormatDrive(hWnd : HWND; Drive : Word; fmtID : Word; Options : Word) : Longint; stdcall; external 'Shell32.dll' name 'SHFormatDrive';
После чего ее можно вызывать, для форматирования например диска А:
procedure TForm1.Button1Click(Sender: TObject);
var
FmtRes : longint;
begin
try
FmtRes:= ShFormatDrive(Handle, SHFMT_DRV_A, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT);
case FmtRes of
SHFMT_ERROR : ShowMessage('Error formatting the drive');
SHFMT_CANCEL : ShowMessage('User canceled formatting the drive');
SHFMT_NOFORMAT : ShowMessage('No Format')
else
ShowMessage('Disk has been formatted');
end;
except;
end;
end;
Думаю приведенных примеров будет достаточно, что бы Вы научились использовать функции WinAPI. А что бы Вам помочь, я выложил в интернет, кое-что что может Вам пригодиться для старта.
Вот здесь: можно скачать статью Анатолия Тенцера "Delphi и Windows API", это запакованный Вордовский файл, рекомендую для прочтения, начинающим и программистам среднего уровня, которые еще не чувствуют уверенности в это вопросе.
По следующей ссылке, можно закачать, небольшое FAQ, по API, сделанное по принципу "вопрос - ответ", всего порядка 90 вопросов. Ерунда конечно, но пока не накачаете из сети самостоятельной документации, это вполне может пригодиться.
И напоследок еще один файлик тоже FAQ по Делфи, на русском языке, там многие найдут ответы на вопросы присланные мне, хотя этой подборке уже много лет, но начинающим будет познавательно. Все файлы, небольшие, суммарно около 200кб :), и гарантирую работоспособность ссылок в течении месяца, потом удалю, поэтому если надо качайте, не откладывайте на потом.
На этом позвольте раскланяться и расшкаркаться.
Оставайтесь с нами.
/Tisa Написать письмо.