Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Симулируем нажатие клавиш на клавиатуре

Delphi , ОС и Железо , Клавиши

Симулируем нажатие клавиш на клавиатуре

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{PostKeyEx32 function}

 procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
 {************************************************************ 
* Procedure PostKeyEx32 
* 
* Parameters: 
*  key    : virtual keycode of the key to send. For printable 
*           keys this is simply the ANSI code (Ord(character)). 
*  shift  : state of the modifier keys. This is a set, so you 
*           can set several of these keys (shift, control, alt, 
*           mouse buttons) in tandem. The TShiftState type is 
*           declared in the Classes Unit. 
*  specialkey: normally this should be False. Set it to True to 
*           specify a key on the numeric keypad, for example. 
* Description: 
*  Uses keybd_event to manufacture a series of key events matching 
*  the passed parameters. The events go to the control with focus. 
*  Note that for characters key is always the upper-case version of 
*  the character. Sending without any modifier keys will result in 
*  a lower-case character, sending it with [ssShift] will result 
*  in an upper-case character! 
// Code by P. Below 
************************************************************}
 type
   TShiftKeyInfo = record
     shift: Byte;
     vkey: Byte;
   end;
   byteset = set of 0..7;
 const
   shiftkeys: array [1..3] of TShiftKeyInfo =
     ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
     (shift: Ord(ssShift); vkey: VK_SHIFT),
     (shift: Ord(ssAlt); vkey: VK_MENU));
 var
   flag: DWORD;
   bShift: ByteSet absolute shift;
   i: Integer;
 begin
   for i := 1 to 3 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
   end; { For }
   if specialkey then
     flag := KEYEVENTF_EXTENDEDKEY
   else
     flag := 0;

   keybd_event(key, MapvirtualKey(key, 0), flag, 0);
   flag := flag or KEYEVENTF_KEYUP;
   keybd_event(key, MapvirtualKey(key, 0), flag, 0);

   for i := 3 downto 1 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
         KEYEVENTF_KEYUP, 0);
   end; { For }
 end; { PostKeyEx32 }


 // Example: 

procedure TForm1.Button1Click(Sender: TObject);
 begin
   //Pressing the Left Windows Key 
  PostKeyEx32(VK_LWIN, [], False);

   //Pressing the letter D 
  PostKeyEx32(Ord('D'), [], False);

   //Pressing Ctrl-Alt-C 
  PostKeyEx32(Ord('C'), [ssctrl, ssAlt], False);
 end;

Функция PostKeyEx32 в Delphi имитирует нажатие клавиши на клавиатуре, используя функцию Windows API keybd_event для отправки серии событий клавиатуры контроллю с фокусом.

Функция принимает три параметра:

  • key: Виртуальный код клавиши, которую нужно отправить. Для печатных клавиш это просто код ANSI (например, Ord('D')) для соответствующего символа.
  • shift: Множество модификаторов клавиш (например, shift, control, alt), которые должны быть нажаты одновременно с клавишей.
  • specialkey: Булевое значение, указывающее, является ли клавиша специальной клавишей (например, на числовом блоке).

Функция работает следующим образом:

  1. Она проходит по массиву записей TShiftKeyInfo, которые представляют собой состояние модификаторов клавиш. Для каждой записи она проверяет, находится ли shift-ключ в множестве bShift. Если это так, она имитирует событие нажатия для этого shift-ключа с помощью keybd_event.
  2. Она устанавливает флаг, указывающий, должна ли клавиша быть обработана как расширенная клавиша (например, специальная клавиша на числовом блоке).
  3. Она имитирует событие нажатия для указанной клавиши с помощью keybd_event. Функция MapVirtualKey используется для преобразования виртуального кода клавиши в код сканера.
  4. Она устанавливает флаг, указывающий, что клавиша должна быть отпущена, и имитирует событие отпускания для той же клавиши с помощью keybd_event.
  5. Наконец, она проходит по массиву shift-ключей в обратном порядке и имитирует события отпускания для каждого из них.

Пример кода демонстрирует использование этой функции для имитации нажатия левой клавиши Windows, символа 'D' и Ctrl-Alt-C.

Обратите внимание, что эта функция работает только на платформах Windows и может не работать корректно с различными раскладками клавиатуры или языками. Кроме того, в целом считается плохой практикой использовать keybd_event напрямую, так как это может помешать другим приложениям обрабатывать ввод клавиатуры. Однако в некоторых случаях (например, автоматизации конкретного приложения) использование этой функции может быть необходимым.

Симулируем нажатие клавиш на клавиатуре: процедура PostKeyEx32 позволяет отправлять события нажатия клавиш на клавиатуре для программы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Клавиши ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:17:45/0.0034270286560059/0