При работе с внешними процессами в среде Delphi, особенно с такими приложениями, как Acrobat Reader, часто возникает потребность в автоматизации действий, таких как отправка команд или ввод текста. В данной статье мы рассмотрим, как можно взаимодействовать с процессом Acrobat Reader, запущенным через функцию CreateProcess, для автоматизации печати документов.
Подготовка к взаимодействию с процессом
Для начала работы с внешним процессом, вам необходимо его запустить. В примере кода ниже представлен базовый шаблон запуска Acrobat Reader с указанием пути к документу:
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
CreationFlags: Cardinal;
begin
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb := SizeOf(StartupInfo);
CreationFlags := NORMAL_PRIORITY_CLASS;
if CreateProcess(nil, PChar('C:\Program Files\Adobe\Reader 9.0\Reader\acrord32.exe ' +
'/h /O /N /T "C:\path\to\test2.pdf" "Generic printer"'), nil, nil, False,
CreationFlags, nil, nil, StartupInfo, ProcessInfo) then
begin
// Дальнейшие действия
end;
end;
Ожидание завершения процесса и взаимодействие
Ожидание завершения процесса с помощью WaitForSingleObject с бесконечным таймаутом блокирует выполнение вашего кода до тех пор, пока процесс не завершится. Это не позволяет вам взаимодействовать с процессом. Вместо этого, рекомендуется использовать циклическое ожидание с таймаутом:
const
WaitTimeout = 250; // В миллисекундах
begin
if CreateProcess(...)
then
begin
repeat
if WaitForSingleObject(ProcessInfo.HProcess, WaitTimeout) <> WAIT_OBJECT_0 then
// Действия для взаимодействия с процессом
until True; // или проверка на искомые условия завершения цикла
end;
end;
Нахождение и взаимодействие с окнами процесса
Для взаимодействия с окнами, открытыми в Acrobat Reader, вам необходимо сначала найти нужные окна. Используйте функцию FindWindowEx для поиска диалоговых окон и EnumChildWindows для перебора дочерних окон. С помощью этих функций вы можете найти окно редактирования и кнопку печати:
var
WindowHandle, EditHandle, ButtonHandle: HWND;
begin
// Поиск диалогового окна
WindowHandle := FindWindowEx(...);
if Assigned(WindowHandle) then
begin
// Перебор дочерних окон
EnumChildWindows(WindowHandle, procedure(Handle: HWND; Param: LPARAM): Boolean;
begin
// Нахождение окна редактирования и кнопки печати
// ...
if ... then
EditHandle := Handle;
if ... then
ButtonHandle := Handle;
Result := True; // Продолжить перебор
end, nil);
// Ввод текста в окно редактирования
if Assigned(EditHandle) then
SetWindowText(EditHandle, 'Текст для печати');
// Нажатие кнопки печати
if Assigned(ButtonHandle) then
SendMessage(ButtonHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0);
end;
end;
Заключение
Автоматизация взаимодействия с внешними процессами, такими как Acrobat Reader, требует понимания работы оконных сообщений и функций Windows API. Используя циклическое ожидание и перебор окон, можно автоматизировать ввод текста и нажатие кнопок, что позволяет автоматизировать такие задачи, как печать документов. Однако, всегда стоит помнить о том, что такие методы могут быть нестабильными и зависеть от конкретной версии приложения.
Автоматизация взаимодействия с процессом Acrobat Reader для выполнения команд печати через Delphi 7, используя функции `CreateProcess` и Windows API для управления окнами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS