Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];
ВнизНажатие клавиши Найти похожие ветки
← →
Сергей К. (2011-03-13 02:05) [0]Здравствуйте! Этот код осуществляет нажатие клавиши:
keybd_event(Ord("T"), MapVirtualKey(Ord("T"), 0), 0, 0);
keybd_event(Ord("T"), MapVirtualKey(Ord("T"), 0), KEYEVENTF_KEYUP, 0);
В данном случае нажимается кнопка "т", но суть в том, что в переменой s (тип string) у меня бывают разные символны. Ну если быть точным то может быть любая буква русского алфавита. Вопрос как имея в переменной букву алфавита, программно симмулировать ее нажатие.
Заранее спасибо.
← →
KilkennyCat © (2011-03-13 02:09) [1]вместо "T" написать эту переменную
← →
Сергей К. (2011-03-13 02:11) [2]
> вместо "T" написать эту переменную
Хех, не работает )
← →
Сергей К. (2011-03-13 02:20) [3]Я несколько уточню свой вопрос. Как имея в переменной string некое значение (а это всегда один символ русского алфавита) программно нажать точно такую же клавишу?
← →
KilkennyCat © (2011-03-13 02:33) [4]
> всегда один символ русского алфавита
в переменной стринг не хранят (обычно).
> Хех, не работает )
ну еще бы. типы переменных, что собой представляют, ферштейн?
стринг - это далеко не байт-код клавиатуры
← →
Сергей К. (2011-03-13 02:38) [5]объясните плиз, я не понимаю.
вот у меня в переменой s некий символ. к примеру "ы". Долго рассказывать почему, да и это не суть. Короче в стринг всегда один символ и всегда русский. Мне нужно симмулировать нажатие именно этой клавиши. Т.е к примеру если символ Ы, то соответственно должен сработать код, который симмулирует нажатие этой клавиши. . как это сделать?
← →
Сергей К. (2011-03-13 02:41) [6]Вот что я имею ввиду. ТАкой код:
if s="й" then begin
keybd_event(Ord("Q"), MapVirtualKey(Ord("Q"), 0), 0, 0);
keybd_event(Ord("Q"), MapVirtualKey(Ord("Q"), 0), KEYEVENTF_KEYUP, 0);
end;
if s="ц" then begin
keybd_event(Ord("W"), MapVirtualKey(Ord("W"), 0), 0, 0);
keybd_event(Ord("W"), MapVirtualKey(Ord("W"), 0), KEYEVENTF_KEYUP, 0);
end;
и так по всем буквам.
Такой код выполнить задачу, но это же явная жесть. Наверняка есть способ упростить код?
← →
KilkennyCat © (2011-03-13 03:10) [7]еще раз: string не предназначена для хранения одного символа.
один символ можно хранить в char, AnsiChar, WideChar, byte, word.
но если хочется все через жопу делать, то хотя бы не поленись прочитать справку про string, наверняка там есть написание, что это упрощенно говоря, массив символов (в случае фиксированного размера, либо указатель, в противном случае), доступ к ОДНОМУ символу нужно делать как к элементу массива.
← →
KilkennyCat © (2011-03-13 03:12) [8]http://delphi.about.com/od/beginners/l/aa071800a.htm
← →
Сергей К. (2011-03-13 03:23) [9]а можно для полного тотального счастья пример? а то не разберусь.
← →
KilkennyCat © (2011-03-13 03:39) [10]конечно можно.
но тотальное счастье - это утопия.
а утопия - это фантастика.
так что пример в вышедаденной ссылке.
> а то не разберусь.
а не смертельно.
← →
Германн © (2011-03-13 03:40) [11]
> Сергей К. (13.03.11 02:20) [3]
>
> Я несколько уточню свой вопрос. Как имея в переменной string
> некое значение (а это всегда один символ русского алфавита)
> программно нажать точно такую же клавишу?
>
Вместо переменной string стоит использовать переменную char. И никаких проблем не будет. Если не используются сторонние компоненты, суть которых не понятна.
← →
Сергей К. (2011-03-13 04:02) [12]Я использую такой код и ниче не происходит
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;
объясните плиз как исправить чтобы заработало?
зы. спасибо, что терпеливо пытаетесь объяснить, но я совсем недавно изучаю дельфи )))
← →
KilkennyCat © (2011-03-13 04:09) [13]запусти такой код:
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:16) [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 русские символы.
← →
Сергей К. (2011-03-13 04:27) [15]Извините, но раз уж вы благородно отвечаете на мои нубские вопросы, то еще один можно?
Если в 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);
якобы должен работать... на самом деле он не работает. как быть если мне нужно симмулировать нажатие клавиши, чтобы скажем в том же блокноте появился символ "ю"?
← →
KilkennyCat © (2011-03-13 04:27) [16]
> акой код лихо работает и показывает код клавиши
сколько цифр?
> не происходит того, что ожидается
а что ожидается?
← →
KilkennyCat © (2011-03-13 04:32) [17]
> как быть если мне нужно симмулировать нажатие клавиши,
> чтобы скажем в том же блокноте появился символ "ю"?
возможно, потребуется переключение раскладки на русскую
var
k : HKL;
const
Rus = 1049;
begin
if LoWord(GetKeyboardLayout(0)) <> Rus then ActivateKeyboardLayout(HKL_NEXT, 0);
или
ActivateKeyboardLayout(LoadKeyboardLayout("00000419",0),0)
← →
Сергей К. (2011-03-13 04:33) [18]Слово "если" начинает раскладывать на цифры:
197
241
226
и.т.д
> а что ожидается?
суть в следующем... в программе, скажем в edit есть текст "у меня есть кошка"... код вытаскивает из строки каждую букву, анализирует ее и нажимает соответствующей клавиши, чтобы в другом приложение скажем блокноте эти символы появлялись.
← →
KilkennyCat © (2011-03-13 04:39) [19]
> Слово "если" начинает раскладывать на цифры:
> 197
> 241
жаль, с юникодом забавнее.
> чтобы в другом приложение скажем блокноте эти символы появлялись.
и в момент работы цикла это другое приложение активно?
← →
Сергей К. (2011-03-13 04:44) [20]
> и в момент работы цикла это другое приложение активно?
ДА, активно.
Давайте так попробуем сформулировать проблему )
Мне нужно в другом приложение (к примеру в блокноте) в момент когда оно активно напечатать путем симулирования нажатия клавиши некий символ. Например "ю". Со всеми символами понятно, а вот ю,б,ж,э,х,ъ не понятно че с ними делать?
← →
KilkennyCat © (2011-03-13 04:49) [21]и что, переключение раскладки не помогает?
← →
Сергей К. (2011-03-13 04:52) [22]
> и что, переключение раскладки не помогает?
неа. вручную переключал, программно - не помогает. фактически свою проблему сформулирую так. в чужом приложение надо симмулировать нажатие русских символов ю,б,ж,э,х,ъ. причем это самое приложение активно и в нем стоит русская раскладка. вот если можно код и все. можно закрыть этот вопрос навсегда. )
← →
KilkennyCat © (2011-03-13 04:59) [23]а все буквы большие?
← →
Сергей К. (2011-03-13 05:28) [24]
> а все буквы большие?
не, все буквы маленькие.
← →
sniknik © (2011-03-13 11:04) [25]
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 13:53) [26]sniknik и KilkennyCat - категорическое спасибо, респект, уважуха и однозначно к карме +1. )) Спасибо!!!
← →
Servy © (2011-03-13 18:22) [27]
> чтобы каждую итерацию цикла не происходило вычисление Length(edit2.
> text), да и безопасней...
Хотелось бы отметить, что значения "от" и "до" у цикла for вычисляются единожды, так что такая оптимизация бессмысленна.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c