Два программера в дупель пьяные из кабака выходят, один дpугому говоpит:
- Hу что, включай автопилот.
- А у меня его нету.
- Hу тогда включай эмулятоp автопилота.
Есть ли в Delphi эквивалент функции SendKeys Visual Basic'а?
Ниже приведена процедура, позволяющаю отправлять нажатия в любой элемент управления (window control), способный принимать ввод с клавиатуры. Вы можете использовать эту технику чтобы включать клавиши NumLock, CapsLock и ScrollLock под Windows NT. Та же техника работает и под Windows 95 для CapsLock и ScrollLock, но не работает для клавиши NumLock. Обратите внимание, что приведены четыре поцедуры:
SimulateKeyDown() - эмулировать нажатие клавиши (без отпускания)
SimulateKeyUp() - эмулировать отпускание клавиши
SimulateKeystroke() - эмулировать удар по клавише (нажатие и отпускание) и
SendKeys(), позволяющие Вам гибко контролировать посылаемые сообщения клавиатуры.
SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke() получают коды виртуальных клавиш (virtural key) (вроде VK_F1). Процедура SimulateKeystroke() получает дополнительный параметр, полезный при эмуляции нажатия PrintScreen. Когда этот параметр равен нулю весь экран будет скопирован в буфер обмена (clipboard). Если дополнительный параметр равен 1 будет скопированно только активное окно.
Четыре метода "button click" демонстрируют использование:
ButtonClick1 - включает capslock
ButtonClick2 - перехватывает весь экран в буфер обмена (clipboard).
ButtonClick3 - перехватывает активное окно в буфер обмена (clipboard).
ButtonClick4 - устанавливает фокус в Edit и отправляет в него строку.
Пример:
procedure SimulateKeyDown(Key : byte);
begin
keybd_event(Key, 0, 0, 0);
end;
procedure SimulateKeyUp(Key : byte);
begin
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;
procedure SimulateKeystroke(Key : byte; extra : DWORD);
begin
keybd_event(Key,extra,0,0);
keybd_event(Key,extra,KEYEVENTF_KEYUP,0);
end;
procedure SendKeys(s : string);
var
i : integer;
flag : bool;
w : word;
begin{Get the state of the caps lock key}
flag := not GetKeyState(VK_CAPITAL) and 1 = 0; {If the caps lock key is on then turn it off}if flag then SimulateKeystroke(VK_CAPITAL, 0); for i := 1 to Length(s) dobegin w := VkKeyScan(s[i]); {If there is not an error in the key translation}if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF)) thenbegin{If the key requires the shift key down - hold it down}if HiByte(w) and 1 = 1 then SimulateKeyDown(VK_SHIFT); {Send the VK_KEY}
SimulateKeystroke(LoByte(w), 0); {If the key required the shift key down - release it}if HiByte(w) and 1 = 1 then SimulateKeyUp(VK_SHIFT); end; end; {if the caps lock key was on at start, turn it back on}if flag then SimulateKeystroke(VK_CAPITAL, 0); end;
procedure TForm1.Button1Click(Sender: TObject); begin{Toggle the cap lock}
SimulateKeystroke(VK_CAPITAL, 0); end;
procedure TForm1.Button2Click(Sender: TObject); begin{Capture the entire screen to the clipboard}{by simulating pressing the PrintScreen key}
SimulateKeystroke(VK_SNAPSHOT, 0); end;
procedure TForm1.Button3Click(Sender: TObject); begin{Capture the active window to the clipboard}{by simulating pressing the PrintScreen key}
SimulateKeystroke(VK_SNAPSHOT, 1); end;
procedure TForm1.Button4Click(Sender: TObject); begin{Set the focus to a window (edit control) and send it a string}
Application.ProcessMessages; Edit1.SetFocus; SendKeys('Delphi Is RAD!'); end;
В статье описывается эмуляция нажатия клавиш в делиффи с помощью процедур SimulateKeyDown, SimulateKeyUp и SimulateKeystroke, а также использование функции SendKeys для отправки сообщений клавиатуры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.