Delphi эмуляция нажатия клавиш

Два программера в дупель пьяные из кабака выходят, один д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 и отправляет в него строку.

Copyright © 2004-2020 "Delphi Sources". Delphi World FAQ

Уважаемые мастаки! Неужели никто не знает, как программно "нажать" комбинацию клавиш Ctrl+P в окне.


Игорь Шевченко ( 2002-10-24 14:16 ) [1]


Ru ( 2002-10-24 16:08 ) [2]

а откуда это keybd_event?


Song ( 2002-10-24 16:23 ) [3]

Читайте также:  Как подключить гитарный процессор к комбику


Gayrus ( 2002-10-25 03:48 ) [4]

Что-то вроде этого:
Keybd_Event(VK_CONTROL,0,0,0);
Keybd_Event(Ord("P"),0,0,0);
Keybd_Event(Ord("P"),0,KEYEVENTF_KEYUP,0);
Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);


Dm9 ( 2002-10-25 05:58 ) [5]

SendMessage (YourWindow.Handle, WM_KeyDown, Ord("P"), 0);
SendMessage (YourWindow.Handle, WM_KeyUp, Ord("P"), 0); —
это без контрола.
А если с ним — не пробовал, но должно работать:
SendMessage (YourWindow.Handle, WM_KeyDown, 17, 0);
SendMessage (YourWindow.Handle, WM_KeyDown, Ord("P"), 0);
SendMessage (YourWindow.Handle, WM_KeyUp, Ord("P"), 0);
SendMessage (YourWindow.Handle, WM_KeyUp, 17, 0);

Или код контрола 16? По-моему, 17. Проверь — в обработчик onKeyDown вставь ShowMessge (IntToStr (Key)) и нажми ctrl.
Получившееся число поставь вместо 17 (хотя, по-моему, там всё-таки 17, а делфи самому загружать в лом сейчас :=)


uktus ( 2002-11-17 11:57 ) [6]

Варианты :
SendMessage (YourWindow.Handle, WM_KeyDown, VK_CONTROL,0);
SendMessage (YourWindow.Handle, WM_KeyDown, Ord("P"), 0);
SendMessage (YourWindow.Handle, WM_KeyUp, Ord("P"), 0);
SendMessage (YourWindow.Handle, WM_KeyUp, VK_CONTROL,0);
или то же самое с keybd_event не работают.

Мне тоже нужно сэмулировать нажатие "Ctrl(Shift)+любая кнопка" в окне чужой программы.
Простое нажатие одной клавиши легко выполняется путем посылки 2-ух сообщений:

SendMessage (Handle, WM_KeyDown, Ord("P"), 0);
SendMessage (Handle, WM_KeyUp, Ord("P"), 0);

Но как сделать то же самое с комбинацией 2-ух клавиш .
Конкретный пример: послать команду "Play" на Windows Media Player: Ctrl+P


chips ( 2002-11-19 16:30 ) [7]

procedure TForm1.Button1Click(Sender: TObject);
var
w: word;
winhandl:HWND;// — handle окна в которое отсылаешь
own:HWND; // -handle твоего приложения
begin
SetForeGroundWindow(winhandl);
keybd_event(vk_control, 0, 0, 0);
w:=VkKeyScan("p");
keybd_event(w,0,0,0);
keybd_event(w,0,KEYEVENTF_KEYUP,0);
keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
SetForegroundWindow(own);// а теперь обратно
end;


chips ( 2002-11-19 16:30 ) [8]

procedure TForm1.Button1Click(Sender: TObject);
var
w: word;
winhandl:HWND;// — handle окна в которое отсылаешь
own:HWND; // -handle твоего приложения
begin
SetForeGroundWindow(winhandl);
keybd_event(vk_control, 0, 0, 0);
w:=VkKeyScan("p");
keybd_event(w,0,0,0);
keybd_event(w,0,KEYEVENTF_KEYUP,0);
keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
SetForegroundWindow(own);// а теперь обратно
end;

  • Автор темы
  • #1
Читайте также:  Lg a290 не включается

The Architect

The Architect

Сейчас мы будем учиться эмулировать нажатие клавиши на клавиатуре.
Этот пример отлично подойдет для написания какой-нибудь экранной клавиатуры, поможет вам сделать нечто подобное калькулятору Windows, т.е. что бы пользователь мог вводить числа и символы не только с клавиатуры, но и при помощи мышки. Вообще вариантов применения огромное множество.
Итак, для начала кидаем на форму компонент Edit с закладки Standart и компонент Button. Создаем, обработчик событий на кнопке и в нем прописываем следующий код.

Вот так будет выглядеть обработчик событий OnClick для кнопки:

P.S. После нажатия на кнопку в Edit1 будет добавляться символ "Ы", тем самым эмулируется нажатие клавиши на клавиатуре.

Как перехватывать нажатия кнопок клавиатуры?
Пригодиться это нам для написания простенького клавиатурного шпиона, который бы отлавливал нажатия клавиш и вёл лог. Можно написать просто небольшой прикол типа если пользователь нажимает клавишу "Ф" то на экране появляется "И". Я думаю фантазия у вас работает нормально, поэтому применение этому коду вы найдете.

В качестве примера мы будем отлавливать нажатие Esc. Нам понадобиться: Компонент Timer с закладки System и компонент Label с закладки Standart. Выделяем Timer, создаем, обработчик событий OnTime() и прописываем в нем следующий код:

Вот что должно получиться:

В данном примере мы перехватываем нажатие клавиши ESC во всем Windows и побарабану активна или нет наша программа. Используем мы здесь API функцию getasynckeystate(), в качестве параметра ей нужно указать виртуальный код клавиши, котрую хотим отлавливать. В нашем случае это Esc виртуальный код $1b.

Да чуть не забыл, свойство Interval у компонента Timer меняем на 1