Содержание материала

Как посылать нажатие клавиш в элемент управления

 

Ниже приведена процедура, позволяющаю отправлять нажатия в любой элемент управления (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 и отправляет в него строку.

 

 

Code:

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) do

begin

   w := VkKeyScan(s[i]);

   {If there is not an error in the key translation}

   if ((HiByte(w) $FF) and (LoByte(w) $FF)) then

   begin

     {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 World is REALY BEST');

end;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить