Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1300221363
Scott Storch
2011-03-15 23:36
2011.06.19
Добавление в таблицу БД


2-1299837557
i7
2011-03-11 12:59
2011.06.19
Как избавиться от ошибок сокетов


2-1296316880
Пироги
2011-01-29 19:01
2011.06.19
Помогите настроить отображение массива в TListView?


2-1299918530
LDV
2011-03-12 11:28
2011.06.19
много get-запросов


2-1299205296
kaini
2011-03-04 05:21
2011.06.19
Формирование строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский