2012-10-18 4 views
5

Мне нужно программно ввести один символ в ячейку сетки Delphi (в другом приложении).Имитация ввода клавиатуры в Delphi с использованием WinAPI

Для того, чтобы сделать это вручную, необходимы следующие шаги:

  1. Нажмите кнопку F3.
  2. Нажмите клавишу со стрелкой вправо 3 раза.
  3. Нажмите кнопку пробела.
  4. Тип буквы «E» на клавиатуре.
  5. Нажмите клавишу со стрелкой вправо.

    // Press F3 button   
    keybd_event(VK_F3, 0, 0, 0);   
    // Press right arrow key 3 times 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    
    // Press the space button 
    keybd_event(VK_SPACE, 0, 0, 0); 
    
    // Type letter E 
    keybd_event(Ord('E'), 0, 0, 0); 
    
    // Move to the right 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    

Но это не работает. Когда я запускаю этот код, ничего не происходит.

Как мне изменить этот код, чтобы он действительно имитировал ввод пользователя?

+0

Некоторое время назад я сделал кое-что о ['virtual keyboard'] (http://stackoverflow.com/a/12565963/960757) (и будет много других). Но к вашей проблеме, если вы нацеливаетесь на «TStringGrid», я думаю, что вы не можете делать ничего, кроме фокусировки и моделирования ваших нажатий клавиш (если я помню это право, «TStringGrid» не отвечает на любое сообщение, которое быть в состоянии установить текст ячейки). – TLama

+0

В этом конкретном приложении можно вводить значения в эту сетку только с клавиатуры. Я уже делал это с помощью AutoHotKey и MS UI Automation, но теперь вам нужно переписать этот код в Delphi. –

+0

Я не могу полагаться на сетку, сфокусированную, потому что есть программа на целевой системе, которая активируется каждые 200 миллисекунд. –

ответ

9

Каждое нажатие клавиши - это клавиша вниз, а затем клавиша вверх. Поэтому вам нужно два вызова keybd_event за нажатие клавиши. Например, нажать F3:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0); 
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0); 

Обратите внимание, что KEYEVENTF_KEYDOWN не фактически определяется заголовочных файлов Windows, или перевода Delphi. Определите его как 0. Это делает код яснее, выписанным явно, хотя.

Естественно, вы не поместили бы свой код парными вызовами в keybd_event. Но вместо этого вы завершаете парные вызовы в вспомогательную функцию.

Возможно, что в некоторых ситуациях вам нужно будет указать второй параметр - код сканирования. Но это часто не обязательно.

+0

Спасибо. Работает ли 'keybd_event', когда этот элемент управления не фокусируется? –

+0

@DmitriPisarenko Не так. Входные сообщения переходят к элементу управления с фокусом ввода. –

+0

Возможно ли заменить вызовы 'keybd_event' с отправкой сообщений Windows в сетку? –

Смежные вопросы