![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нажатие клавиши
Сергей К. © (2011-03-13 02:05:00)Здравствуйте! Этот код осуществляет нажатие клавиши:
keybd_event(Ord('T'), MapVirtualKey(Ord('T'), 0), 0, 0);
keybd_event(Ord('T'), MapVirtualKey(Ord('T'), 0), KEYEVENTF_KEYUP, 0);
В данном случае нажимается кнопка "т", но суть в том, что в переменой s (тип string) у меня бывают разные символны. Ну если быть точным то может быть любая буква русского алфавита. Вопрос как имея в переменной букву алфавита, программно симмулировать ее нажатие.
Заранее спасибо.
Servy (2011-03-13 18:22:00) [1]
> чтобы каждую итерацию цикла не происходило вычисление Length(edit2.
> text), да и безопасней...
Хотелось бы отметить, что значения "от" и "до" у цикла for вычисляются единожды, так что такая оптимизация бессмысленна.
Сергей К. (2011-03-13 13:53:00) [2]sniknik и KilkennyCat - категорическое спасибо, респект, уважуха и однозначно к карме +1. )) Спасибо!!!
sniknik (2011-03-13 11:04:00) [3]
const
INVALIDKEY = $FFFF;
VKKEYSCANSHIFTON = $100;
VKKEYSCANCTRLON = $200;
VKKEYSCANALTON = $400;
procedure SendKeyDown(VKey: Byte; NumTimes: Word; GenUpMsg: Boolean);
var
i: Integer;
ScanCode: Byte;
begin
ScanCode:= Lo(MapVirtualKey(VKey,0));
for i:= 1 to NumTimes do begin
keybd_event(VKey, ScanCode, 0, 0);
if GenUpMsg then
keybd_event(VKey, ScanCode, KEYEVENTF_KEYUP, 0);
end;
end;
procedure SendKeyUp(VKey: Byte);
var
ScanCode: Byte;
begin
ScanCode:= Lo(MapVirtualKey(VKey,0));
keybd_event(VKey, ScanCode, KEYEVENTF_KEYUP, 0);
end;
function PressChar(Ch: Char; NumTimes: Integer): Boolean;
var
MKey: Word;
begin
MKey:= Word(VkKeyScan(Ch));
if MKey <> INVALIDKEY then begin
if MKey and VKKEYSCANSHIFTON <> 0 then SendKeyDown(VK_SHIFT, 1, False);
if MKey and VKKEYSCANCTRLON <> 0 then SendKeyDown(VK_CONTROL, 1, False);
if MKey and VKKEYSCANALTON <> 0 then SendKeyDown(VK_MENU, 1, False);
SendKeyDown(Lo(MKey), NumTimes, true);
if MKey and VKKEYSCANSHIFTON <> 0 then SendKeyUp(VK_SHIFT);
if MKey and VKKEYSCANCTRLON <> 0 then SendKeyUp(VK_CONTROL);
if MKey and VKKEYSCANALTON <> 0 then SendKeyUp(VK_MENU);
result:= true;
end else
result:= false;
end;
procedure TForm1.Memo1Click(Sender: TObject);
begin
PressChar('Б', 1);
PressChar('ю', 2);
end;
Сергей К. (2011-03-13 05:28:00) [4]
> а все буквы большие?
не, все буквы маленькие.
KilkennyCat (2011-03-13 04:59:00) [5]а все буквы большие?
Сергей К. (2011-03-13 04:52:00) [6]
> и что, переключение раскладки не помогает?
неа. вручную переключал, программно - не помогает. фактически свою проблему сформулирую так. в чужом приложение надо симмулировать нажатие русских символов ю,б,ж,э,х,ъ. причем это самое приложение активно и в нем стоит русская раскладка. вот если можно код и все. можно закрыть этот вопрос навсегда. )
KilkennyCat (2011-03-13 04:49:00) [7]и что, переключение раскладки не помогает?
Сергей К. (2011-03-13 04:44:00) [8]
> и в момент работы цикла это другое приложение активно?
ДА, активно.
Давайте так попробуем сформулировать проблему )
Мне нужно в другом приложение (к примеру в блокноте) в момент когда оно активно напечатать путем симулирования нажатия клавиши некий символ. Например "ю". Со всеми символами понятно, а вот ю,б,ж,э,х,ъ не понятно че с ними делать?
KilkennyCat (2011-03-13 04:39:00) [9]
> Слово "если" начинает раскладывать на цифры:
> 197
> 241
жаль, с юникодом забавнее.
> чтобы в другом приложение скажем блокноте эти символы появлялись.
и в момент работы цикла это другое приложение активно?
Сергей К. (2011-03-13 04:33:00) [10]Слово "если" начинает раскладывать на цифры:
197
241
226
и.т.д
> а что ожидается?
суть в следующем... в программе, скажем в edit есть текст "у меня есть кошка"... код вытаскивает из строки каждую букву, анализирует ее и нажимает соответствующей клавиши, чтобы в другом приложение скажем блокноте эти символы появлялись.
KilkennyCat (2011-03-13 04:32:00) [11]
> как быть если мне нужно симмулировать нажатие клавиши,
> чтобы скажем в том же блокноте появился символ "ю"?
возможно, потребуется переключение раскладки на русскую
var
k : HKL;
const
Rus = 1049;
begin
if LoWord(GetKeyboardLayout(0)) <> Rus then ActivateKeyboardLayout(HKL_NEXT, 0);
или
ActivateKeyboardLayout(LoadKeyboardLayout('00000419',0),0)
KilkennyCat (2011-03-13 04:27:00) [12]
> акой код лихо работает и показывает код клавиши
сколько цифр?
> не происходит того, что ожидается
а что ожидается?
Сергей К. (2011-03-13 04:27:00) [13]Извините, но раз уж вы благородно отвечаете на мои нубские вопросы, то еще один можно?
Если в s есть русская буква "т", то уместен код:
if s='т' then begin
keybd_event(Ord('N'), MapVirtualKey(Ord('N'), 0), 0, 0);
keybd_event(Ord('N'), MapVirtualKey(Ord('N'), 0), KEYEVENTF_KEYUP, 0);
end;
Если посмотреть на клавиатуру, то как раз это можно увидеть. А как быть с русскими буквами типа "ю", "б"... например ю соответствует символу ">"... соответственно код
keybd_event(Ord('>'), MapVirtualKey(Ord('>'), 0), 0, 0);
keybd_event(Ord('>'), MapVirtualKey(Ord('>'), 0), KEYEVENTF_KEYUP, 0);
якобы должен работать... на самом деле он не работает. как быть если мне нужно симмулировать нажатие клавиши, чтобы скажем в том же блокноте появился символ "ю"?
Сергей К. (2011-03-13 04:16:00) [14]
> edit2.text:=s;for u:=1 to Length(edit2.text) do begin
> showmessage(inttostr(Ord(Edit2.Text[u]))); end;
такой код лихо работает и показывает код клавиши, но задача нажимать клавишу, поэтому если его интегрировать сюда:
keybd_event((Ord(Edit2.Text[u])), 0, 0, 0);
keybd_event((Ord(Edit2.Text[u])), 0, KEYEVENTF_KEYUP, 0);
то не происходит того, что ожидается.. при этом надо отметить что в s русские символы.
KilkennyCat (2011-03-13 04:09:00) [15]запусти такой код:
edit2.text:=s;
for u:=1 to Length(edit2.text) do
begin
showmessage(inttostr(Ord(Edit2.Text[u])));
end;
и кстати, лучше делать так:
var
slen : integer;
..................
edit2.text:=s;
slen := Length(edit2.text);
for u:=1 to do slen ....
чтобы каждую итерацию цикла не происходило вычисление Length(edit2.text), да и безопасней...
Сергей К. (2011-03-13 04:02:00) [16]Я использую такой код и ниче не происходит
edit2.text:=s;
for u:=1 to Length(edit2.text) do
begin
keybd_event(Ord(Edit2.Text[u]), 0, 0, 0);
keybd_event(Ord(Edit2.Text[u]), 0, KEYEVENTF_KEYUP, 0);
end;
объясните плиз как исправить чтобы заработало?
зы. спасибо, что терпеливо пытаетесь объяснить, но я совсем недавно изучаю дельфи )))
Германн (2011-03-13 03:40:00) [17]
> Сергей К. (13.03.11 02:20) [3]
>
> Я несколько уточню свой вопрос. Как имея в переменной string
> некое значение (а это всегда один символ русского алфавита)
> программно нажать точно такую же клавишу?
>
Вместо переменной string стоит использовать переменную char. И никаких проблем не будет. Если не используются сторонние компоненты, суть которых не понятна.
KilkennyCat (2011-03-13 03:39:00) [18]конечно можно.
но тотальное счастье - это утопия.
а утопия - это фантастика.
так что пример в вышедаденной ссылке.
> а то не разберусь.
а не смертельно.
Сергей К. (2011-03-13 03:23:00) [19]а можно для полного тотального счастья пример? а то не разберусь.
KilkennyCat (2011-03-13 03:12:00) [20]http://delphi.about.com/od/beginners/l/aa071800a.htm