| 
 Эмуляция нажатия клавиш 2
 
 |  | Два программера в дупель пьяные из кабака выходят, один дpугому говоpит: - Hу что, включай автопилот.
 - А у меня его нету.
 - Hу тогда включай эмулятоp автопилота.
 | 
 
 
Есть ли в 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;
 | 
 
 |