{{notification.text}}

MirGames

27.05.06 01:58
0
Сообщение о нажатиях клавиш называется WM_KEYDOWN. Но это сообщение не учитывает ни текущий язык, ни регистр.
1) Есть ли в lParam информация об этом? Если да, то в каких битах?
2) Есть ли возможность получить именно код клавиши с учетом этой информации через WinApi?
Отредактировано: 27.05.06 01:59
#2
MirGames Dev
27.05.06 14:32
0
Цитата
Но это сообщение не учитывает ни текущий язык, ни регистр.

WM_INPUTLANGCHANGE - посылается при изменении языка ввода
А регистр... смотри на состояние клавишы Shift? И на состояние Caps Lock?
#3
27.05.06 18:45
0
XProger,
а в какой кодировке присылается номер нажатой клавиши? У меня на Ы приходит 219, а на ы приходит 251. Я такой кодировки не знаю :(

MeF
Так и сделал бы, если бs мелкософт не позаботился о такой важной штуке :)
#4
аксакал
27.05.06 20:13
0
visual
Ansi
#5
Мастер XO
27.05.06 21:25
0
Вот проверка клавиш Alt, Ctrl, Shift и CapsLock на нажатость:
Код
function AltKeyDown : boolean;
begin result:=(Word(GetKeyState(VK_MENU)) and $8000)<>0; end;

function CtrlKeyDown : boolean;
begin result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0; end;

function ShiftKeyDown : boolean;
begin result:=(Word(GetKeyState(VK_SHIFT)) and $8000)<>0; end;

function CapsLock : boolean;
begin result:=(GetKeyState(VK_CAPITAL) and 1)<>0; end;


Это трансляция нажимаемых клавиш в символы в зависимости от раскладки и регистра
Код
function VKeyToChar(wParam: wParam; AppHWND : HWND): Char;
var idProcess  : THandle;
    pTransChar : PChar;
    keybs      : TKeyboardState;
    hKLayout   : HKL;
begin
  GetKeyBoardState(keybs);

  if CtrlKeyDown  then keybs[VK_CONTROL] := 129;
  if AltKeyDown   then keybs[VK_MENU]    := 129;
  if ShiftKeyDown then keybs[VK_SHIFT]   := 129;

  GetMem(pTransChar,3);

  idProcess := GetWindowThreadProcessId(appHWND,nil);
  hKLayout  := GetKeyboardLayout(idProcess);

  ToAsciiEx(wParam,0,keybs,pTransChar,0,hKLayout);

  Result := pTransChar^;

  FreeMem(pTransChar);
end;
Отредактировано: 27.05.06 21:27
#6
Мастер XO
27.05.06 21:29
0
А вот отдельно получение языка (раскладки):
Код
var Layout:Word;

<...>

Layout:=GetKeyboardLayout(0);
case Layout of
  $0419 : <...>; //Русский язык
  $0409 : <...>; //Английский язык
end;
#7
29.05.06 21:05
0
Всем спасибо, тема исчерпана! :)
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}