![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Зачем?