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

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

TEdit - программно отразить символ клавиатуры [D5]


ЕК ©   (2004-12-31 10:16:00) 

Как эмитировать нажатие клавиши клавиатуры программно в компаненте
наследнике TEdit.  Собственно необходимо отразить набранный символ
клавиатуры при известном коде клавиши(Key:Word), да это
необходимо сделать так чтобы в TEdit отразился именно тот
символ как при реальном нажатии- с учетом раскладки клавиатуры?


ЕК   (2004-12-31 12:19:00) [1]

Спасибо Jay1982 ©   и P.N.P. © что откликнулись, буду досканально разбираться- надо время для этого.


Jay1982   (2004-12-31 11:58:00) [2]

Или же VFORM := Form1...


Jay1982   (2004-12-31 11:55:00) [3]


procedure VFORM.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;

где VFORM - переменная (текущая форма), наверное можно так:

var
 VFORM: TForm;

 VFORM := Self

и естественно не забывай проверять раскладку клавиатуры
P.N.P. ©   (31.12.04 11:33) [12]


ЕК   (2004-12-31 11:49:00) [4]

To
Jay1982 ©   (31.12.04 11:32) [11]
Код работает. Но вот как реализовать его в компаненте при смене
свойства Key из инспектора объектов или  например при смене его
в ходе выполнения программы.


P.N.P.   (2004-12-31 11:33:00) [5]

См. Jay1982 ©   (31.12.04 11:04) [9]


var
P:PChar;
begin
GetMem(p,255);
GetKeyboardLayoutName(P);
 if P='00000409'  then //English
 if P='00000419'  then //Russian
FreeMem(P);
end;


Jay1982   (2004-12-31 11:32:00) [6]

Попробуй так:

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;


ЕК   (2004-12-31 11:16:00) [7]

To
P.N.P. ©   (31.12.04 10:57) [7]
SendMessage(Edit.Handle,WM_CHAR,Key,0);
так я делал ситуацию выше с символом Юя описал.

To

procedure 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;

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


Jay1982   (2004-12-31 11:04:00) [8]

Проверяй состояние раскладки, и соответственно изменяй код выводимой клавиши


ЕК   (2004-12-31 10:59:00) [9]

В том то и дело что Chr не пойдет, так как не учитывает раскладку

клавиатуры, да и например нажимаем клавишу c символами ("'Ээ)-Код 222,

а
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 Text:=Chr(Key)
end;
даст символ Юа на клавише его нет.


Jay1982   (2004-12-31 10:57:00) [10]


procedure 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;

где key - VK_HOME, VK_F1...


P.N.P.   (2004-12-31 10:57:00) [11]

SendMessage(Edit.Handle,WM_CHAR,Key,0);


Jay1982   (2004-12-31 10:55:00) [12]

Скорее не определять нажатую, а именно нажимать, програмно


P.N.P.   (2004-12-31 10:46:00) [13]

Несовсем понятно...
Может это имеется ввиду?

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if AnsiUpperCase(Chr(Key))[1] in ['А'..'Я', 'A'..'Z'] then
   Label1.Caption := Chr(key) else
   Label1.Caption := '';
 if ssShift in Shift then Label1.Caption := 'Shift + ' + Label1.Caption;
 if ssAlt in Shift then Label1.Caption := 'Alt + ' + Label1.Caption;
 if ssCtrl in Shift then Label1.Caption := 'Ctrl + ' + Label1.Caption;
end;


Jay1982   (2004-12-31 10:31:00) [14]

<Sandman25 ©   (31.12.04 10:17) [1]

За шкафом


ЕК   (2004-12-31 10:28:00) [15]

Пишу компанент что типа THotKey


Sandman25   (2004-12-31 10:17:00) [16]

Зачем?


Наверх

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