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


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Компоненты / Функция keybd_event() принимает значения до 244 - как мне отправить нажатие клавиши с кодом #255 в элемент управления Windows? Сделать домашней страницей Добавить в избранное Написать писмо

Функция keybd_event() принимает значения до 244 - как мне отправить нажатие клавиши с кодом #255 в элемент управления Windows?


Это может понадобится для иностранных языков или для специальных символов. (например, в русских шрифтах символ с кодом #255 - я прописное). Приведенный в примере метод, не стоит использовать в случае если символ может быть передан обычным способом (функцией keybd_event()).

procedure TForm1.Button1Click(Sender: TObject);
var
   KeyData : packed record
       RepeatCount : word;
       ScanCode : byte;
       Bits : byte;
   end;
begin
   {Let the button repaint}
   Application.ProcessMessages;
   {Set the focus to the window}
   Edit1.SetFocus;
   {Send a right so the char is added to the end of the line}
   //  SimulateKeyStroke(VK_RIGHT, 0);
   keybd_event(VK_RIGHT, 0,0,0);
   {Let the app get the message}
   Application.ProcessMessages;
   FillChar(KeyData, sizeof(KeyData), #0);
   KeyData.ScanCode := 255;
   KeyData.RepeatCount := 1;
   SendMessage(Edit1.Handle, WM_KEYDOWN, 255,LongInt(KeyData));
   KeyData.Bits := KeyData.Bits or (1 shl 30);
   KeyData.Bits := KeyData.Bits or (1 shl 31);
   SendMessage(Edit1.Handle, WM_KEYUP, 255, LongInt(KeyData));
   KeyData.Bits := KeyData.Bits and not (1 shl 30);
   KeyData.Bits := KeyData.Bits and not (1 shl 31);
   SendMessage(Edit1.Handle, WM_CHAR, 255, LongInt(KeyData));
   Application.ProcessMessages;
end;



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

Комментарий от "Aleksey Moiseev" (moiseev@samara-gsm.ru)

Этот способ не годится, если нельзя получить handle у Edit-а, в который надо послать сообщение, что бывает, когда вводишь символы в чужую программу.

Для передачи русских символов в keybd_event, например, того же 'я', надо сначала переключить раскладку клавиатуры на русский, а затем вызвать keybd_event, передав ему scan-код символа.
Для переключения раскладки в чужой программе можно делать так:

var rus,curKey,progKey: HKL;
    hwProg,progId : THandle;
begin
   // получить handle окна чужой программы
 hwProg := findWindow('<класс окна>','<заголовок окна>');
   // Получить идентификатор чужого процесса
 progId := GetWindowThreadProcessId(HwProg,nil);  
 SetForegroundWindow(hwProg);
 SetActiveWindow(hwProg);
   // Получить ссылку на русскую раскладку
 rus:=LoadKeyboardLayout('00000419', 0);  
   // Переключить раскладку на русскую
 ActivateKeyboardLayout(rus,KLF_ACTIVATE);  
 curKey := GetKeyboardLayout(0);  // Получить текущую раскладку
   // Получить текущую раскладку в чужой программе
 progKey := GetKeyboardLayout(progId);
   // переключить раскладку в hwProg
 if progKey <> curKey then begin
   sendMessage(hwProg,WM_INPUTLANGCHANGEREQUEST,1,curKey);  
   Application.processMessages;
  // можно вставить задержку, что-нибудь типа delay(1000) из rxlib
 end;

 keybd_event(lo(VkKeyScan('я')),0,0,0);  // Ввести символ, например, 'я'

// Таким же образом переключить раскладку обратно
...
end;

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