как программно нажимать АЛФАВИТНО-ЦИФРОВЫЕ клавиши

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Shredder2003
Сообщения: 3
Зарегистрирован: 25 фев 2005, 09:55

как программно нажимать алфавитно-цифровые клавиши, чтобы система это воспринимала так, как будто пользователь нажимает эти клавиши на клавиатуре?
есть решение

procedure TForm1.SetKey(Key:Integer);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

SetKey(VK_SCROLL);
SetKey(VK_CAPITAL);

, но если сделать SetKey(Ord('A')), то посылается совсем не то. Я могу экспериментально установить, что в этом случае у 'm' код 77, но как делать точное преобразование char->key?
по каким правилам, или может, табличка есть какая?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вот выдержка из Windows.pas

Код: Выделить всё

  {$EXTERNALSYM VK_DELETE}
  VK_DELETE = 46;
  {$EXTERNALSYM VK_HELP}
  VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
  {$EXTERNALSYM VK_LWIN}
  VK_LWIN = 91;
Это виртуальные коды клавиш. Они в Windows.pas по какой-то причине закомментированы. Определите их сами.
Между тем Вас ждет еще одна проблема. Вы не можете послать строчную или прописную, русскую или латинскую букву. Это будет определено текущим состоянием регистров. Рекомендую использовать SendMessage и посылать события vm_char или vm_keydown, которые обычнот формируются уже дайвером клавиатуры и содержат коды символов.

Описание структуры TWMKey есть в messages.pas
Shredder2003
Сообщения: 3
Зарегистрирован: 25 фев 2005, 09:55

"Вы не можете послать строчную или прописную, русскую или латинскую букву. Это будет определено текущим состоянием регистров."
Я программно переключаю раскладку и регистр клавы, поэтому всё ОК.
Но есть одна загвоздка - как "нажать" буквы Ю,Б,Ё,Ъ,Х,Ж,Э?
Ибо если вызывать функцию keybd_event с кодом точки и пеключиться в русскую раскладку, то вызывается вовсе не Ю, а либо точка, либо запятая.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Shredder2003, попробуй VkKeyScanEx, там можно явно задавать раскладку клавиатуры
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Я программно переключаю раскладку и регистр клавы, поэтому всё ОК.
"Я знал, что ты это скажешь" (с) :)

Ну и зачем Вам этот гемор? Куда проще сделать SendMessage.
Тут ведь можно посылать клавиши разным окнам. Тут не надо заботиться о раскладках.
Кстати, как Вы переключаете раскладку. Вы проверили, что Ваша программа правильно работает, если у пользователя не установлена русская раскладка, или установлено три раскладки, вместо обычных двух?

Мне кажется Вы делаете лишнюю работу. Вы управляете драйвером клавиатуры, который в свою очередь вычисляет ASCII код и делает SendMessage. Куда проще самому послать сообщение.

Так, кстати говоря, можно посылать окнам мышиные сообщения (без перемещения курсора самой мыши, естественно). Т.е. окно будет "думать", что в нем кликнули там-то.
Shredder2003
Сообщения: 3
Зарегистрирован: 25 фев 2005, 09:55

1. "Ну и зачем Вам этот гемор? Куда проще сделать SendMessage. " --- один человек так сделал и прислал мне эту прогу совершенно за просто так, из спортивного интереса. Посылаются кракозябли, да и классы окон надо узнавать, прописывать...

2. "Вы проверили, что Ваша программа правильно работает, если у пользователя не установлена русская раскладка, или установлено три раскладки, вместо обычных двух? " -- а мне плевать, как она работает у пользователей, я эту прогу для себя делаю, для облегчения своего труда.

3. Все, проблема решена, я сделал эту прогу!!!

ТЕМА ЗАКРЫТА!
Ответить