unit Unit1;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
AppInst: THandle;
AppWind: THandle;
public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.DFM}uses ShellAPI;
procedure SendShift(H: HWnd; Down: Boolean);
var
vKey, ScanCode, wParam: Word;
lParam: longint;
begin
vKey := $10;
ScanCode := MapVirtualKey(vKey, 0);
wParam := vKey or ScanCode shl 8;
lParam := longint(ScanCode) shl 16 or 1;
ifnot (Down) then
lParam := lParam or $C0000000;
SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;
procedure SendCtrl(H: HWnd; Down: Boolean);
var
vKey, ScanCode, wParam: Word;
lParam: longint;
begin
vKey := $11;
ScanCode := MapVirtualKey(vKey, 0);
wParam := vKey or ScanCode shl 8;
lParam := longint(ScanCode) shl 16 or 1;
ifnot (Down) then
lParam := lParam or $C0000000;
SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;
procedure SendKey(H: Hwnd; Key: char);
var
vKey, ScanCode, wParam: Word;
lParam, ConvKey: longint;
Shift, Ctrl: boolean;
begin
ConvKey := OemKeyScan(ord(Key));
Shift := (ConvKey and $00020000) <> 0;
Ctrl := (ConvKey and $00040000) <> 0;
ScanCode := ConvKey and $000000FF or $FF00;
vKey := ord(Key);
wParam := vKey;
lParam := longint(ScanCode) shl 16 or 1;
if Shift then
SendShift(H, true);
if Ctrl then
SendCtrl(H, true);
SendMessage(H, WM_KEYDOWN, vKey, lParam);
SendMessage(H, WM_CHAR, vKey, lParam);
lParam := lParam or $C0000000;
SendMessage(H, WM_KEYUP, vKey, lParam);
if Shift then
SendShift(H, false);
if Ctrl then
SendCtrl(H, false);
end;
function EnumFunc(Handle: HWnd; TF: TForm1): Bool; far;
begin
TF.AppWind := 0;
if GetWindowWord(Handle, GWW_HINSTANCE) = TF.AppInst then
TF.AppWind := Handle;
result := (TF.AppWind = 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Text: array[0..255] of char;
begin
AppInst := ShellExecute(Handle, 'open', 'notepad.exe', nil, '', SW_NORMAL);
EnumWindows(@EnumFunc, longint(self));
AppWind := GetWindow(AppWind, GW_CHILD);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SendKey(AppWind, 'T');
SendKey(AppWind, 'e');
SendKey(AppWind, 's');
SendKey(AppWind, 't');
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
beginif AppWind <> 0 then
SendKey(AppWind, Key);
end;
end.
Перевод контента на русский язык:
Это программное обеспечение на языке Delphi, создаваемое для создания приложения Windows с двумя кнопками и формой. Когда кликается первая кнопка, она открывает файл Notepad.exe в текущем пространстве процессов. Когда кликается вторая кнопка, она имитирует ввод текста "Test" в активном окне. Третий процедурный блок позволяет пользователю вводить текст на форме, который затем отправляет клавиатурные команды в активное окно.
Разбивка на секции:
Декларация модуля: Модуль называется Unit1, и он импортирует различные единицы Windows API.
Декларация формы: Форма декларируется как TForm1, с тремя кнопками (Button1-Button3) и тремя процедурами (Button1Click, Button2Click и FormKeyPress). Форма также имеет два приватных переменные, AppInst и AppWind, которые используются для хранения идентификатора процесса и идентификатора окна Notepad.exe.
Декларации процедур: В этом модуле декларируются несколько процедур:
SendShift: отправляет событие клавиши shift в указанное окно.
SendCtrl: отправляет событие клавиши control в указанное окно.
SendKey: имитирует ввод клавиатуры в указанное окно.
EnumFunc: перечисляет окна в пространстве процессов и находит идентификатор окна Notepad.exe.
Procedure Button1Click: Когда кликается эта кнопка, она открывает файл Notepad.exe с помощью функции API ShellExecute и затем находит идентификатор окна Notepad.exe с помощью функции API EnumWindows.
Procedure Button2Click: Эта процедура имитирует ввод текста "Test" в активном окне, вызывая процедуру SendKey для каждого символа в строке.
Procedure FormKeyPress: Когда пользователь вводит символ на форме, эта процедура отправляет клавиатурную команду в активное окно.
Некоторые предложения:
Вместо использования функции API ShellExecute для открытия файла Notepad.exe, можно использовать функцию API CreateProcess или StartPathW для более контролируемого создания процесса.
Можно использовать функцию API GetForegroundWindow для нахождения активного окна вместо зависимости от приватных переменных формы.
Procedure FormKeyPress может быть улучшен путем проверки, является ли клавиатурная команда модификаторной клавишей (например, shift, ctrl) и отправки соответствующего события с помощью SendShift или SendCtrl.
Можно добавить более функциональности в форму, например, позволить пользователю вводить несколько строк текста или управлять позицией курсора.
Данное описание статьи на русском языке: Показано создание приложения для отправки кодов клавиш и текста в окно another application.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.