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

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

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

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

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

 {With keybd_event API}

 procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState;
   specialkey: Boolean);
 {************************************************************ 
 * Procedure PostKeyEx 
 * 
 * Parameters: 
 *  hWindow: target window to be send the keystroke 
 *  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. 
 *           If this parameter is true, bit 24 of the lparam for
 *           the posted WM_KEY* messages will be set.
 * Description:
 *  This procedure sets up Windows key state array to correctly
 *  reflect the requested pattern of modifier keys and then posts
 *  a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then
 *  Application.ProcessMessages is called to process the messages
 *  before the keyboard state is restored.
 * Error Conditions:
 *  May fail due to lack of memory for the two key state buffers.
 *  Will raise an exception in this case.
 * NOTE:
 *  Setting the keyboard state will not work across applications
 *  running in different memory spaces on Win32 unless AttachThreadInput
 *  is used to connect to the target thread first.
 *Created: 02/21/96 16:39:00 by P. Below
 ************************************************************}

 type
   TBuffers = array [0..1] of TKeyboardState;
 var
   pKeyBuffers: ^TBuffers;
   lParam: LongInt;
 begin
   (* check if the target window exists *)
   if IsWindow(hWindow) then
   begin
     (* set local variables to default values *)
     pKeyBuffers := nil;
     lParam := MakeLong(0, MapVirtualKey(key, 0));

     (* modify lparam if special key requested *)
     if specialkey then
       lParam := lParam or $1000000;

     (* allocate space for the key state buffers *)
     New(pKeyBuffers);
     try
       (* Fill buffer 1 with current state so we can later restore it.
          Null out buffer 0 to get a "no key pressed" state. *)
       GetKeyboardState(pKeyBuffers^[1]);
       FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);

       (* set the requested modifier keys to "down" state in the buffer*)
       if ssShift in shift then
         pKeyBuffers^[0][VK_SHIFT] := $80;
       if ssAlt in shift then
       begin
         (* Alt needs special treatment since a bit in lparam needs also be set *)
         pKeyBuffers^[0][VK_MENU] := $80;
         lParam := lParam or $20000000;
       end;
       if ssCtrl in shift then
         pKeyBuffers^[0][VK_CONTROL] := $80;
       if ssLeft in shift then
         pKeyBuffers^[0][VK_LBUTTON] := $80;
       if ssRight in shift then
         pKeyBuffers^[0][VK_RBUTTON] := $80;
       if ssMiddle in shift then
         pKeyBuffers^[0][VK_MBUTTON] := $80;

       (* make out new key state array the active key state map *)
       SetKeyboardState(pKeyBuffers^[0]);
       (* post the key messages *)
       if ssAlt in Shift then
       begin
         PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
         PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);
       end
       else
       begin
         PostMessage(hWindow, WM_KEYDOWN, key, lParam);
         PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);
       end;
       (* process the messages *)
       Application.ProcessMessages;

       (* restore the old key state map *)
       SetKeyboardState(pKeyBuffers^[1]);
     finally
       (* free the memory for the key state buffers *)
       if pKeyBuffers <> nil then
         Dispose(pKeyBuffers);
     end; { If }
   end;
 end; { PostKeyEx }

 // Example: 

procedure TForm1.Button1Click(Sender: TObject);
 var
   targetWnd: HWND;
 begin
   targetWnd := FindWindow('notepad', nil)
     if targetWnd <> 0 then
     begin
       PostKeyExHWND(targetWnd, Ord('I'), [ssAlt], False);
   end;
 end;

Вот перевод текста на русский язык:

Это код Delphi, который имитирует нажатие клавиши '3' на клавиатуре. Процедура PostKeyExHWND отправляет событие имитированного ввода в указанное окно.

Вот шаг за шагом, что код делает:

  1. Сначала он проверяет, существует ли целевое окно с помощью функции IsWindow.
  2. Если окно существует, то он настраивает два буфера для состояния клавиатуры: один для текущего состояния и другой для запрошенного состояния.
  3. Процедура затем модифицирует параметр lParam для отражения запрошенного кода клавиши (в этом случае 'I') и устанавливает флаг специальной клавиши, если это необходимо.
  4. Он выделяет память для буферов состояния клавиатуры с помощью функции New.
  5. Затем процедура заполняет буфер 1 текущим состоянием клавиатуры с помощью функции GetKeyboardState и буфером 0 состоянием "никакой клавиши не нажата" с помощью функции FillChar.
  6. Она устанавливает запрошенные модификаторы клавиш в состояние "нажата" в буфере с помощью битовых операций (например, ssShift in shift then pKeyBuffers^[0][VK_SHIFT] := $80;).
  7. Процедура затем делает новый массив состояния клавиатуры активным состоянием карты клавиатуры с помощью функции SetKeyboardState.
  8. Она отправляет сообщение WM_KEYDOWN в целевое окно с запрошенным кодом клавиши и параметром lParam.
  9. Если клавиша Alt нажата, то она также отправляет сообщение WM_SYSKEYDOWN.
  10. Затем процедура вызывает Application.ProcessMessages, чтобы обработать любые сообщения, генерируемые имитированным событием ввода.
  11. Наконец, она восстанавливает старое состояние карты клавиатуры с помощью функции SetKeyboardState и освобождает память для буферов состояния клавиатуры с помощью функции Dispose.

В примере кода процедура Button1Click имитирует нажатие клавиши 'I' с нажатой Alt, вызывая PostKeyExHWND с handle окна Notepad (найденным с помощью функции FindWindow) и необходимыми параметрами.

Симулируем нажатие клавиши Alt+I на окне Notepad.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:59:37/0.0033798217773438/0