Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нажатие клавиши


Страницы:   1 2

Сергей К. ©   (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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо