На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Win Api / Есть ли в Delphi эквивалент функции SendKeys Visual Basic'а? Сделать домашней страницей Добавить в избранное Написать писмо

Есть ли в 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 и отправляет в него строку.
Пример:

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 Is RAD!');
end;


Источник: Дельфи. Вокруг да около.

А теперь у нас есть целый модуль для этого:
http://delphi.mastak.com/articles/sendkey.html


Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz