Jak rozróżnić klawisze w OnKeyDown?

0

Jeżeli w OnKeyDown formy dam taki kod

Caption := IntToStr(Ord(Char(Key)));

To w belce będzie wyświetlać kody ASCII klawiszy. Niby działa, ale jak wcisnę Lewy Ctrl i Prawy Ctrl to będzie zawsze 17.

Tuningowałem kod do takiej postaci

if Ord(Char(Key)) = 18 then Caption := 'right alt'
  else

Noi działa poprawnie. Wciskam prawy alt i jest dobrze.
Problem pojawia się przy lewym alt'cie. Jeżeli wcisnę Prawy alt, belka zmieni się za każdym razem. Niestety przy lewym alcie, dopiero co drugie wciśnięcie jest zaliczane o.O

Moje pytania:

  1. Jak rozróżnić Lewy i Prawy Ctrl bez zakładania hooka?
  2. Jak sprawić by każde wciśnięcie lewego altu było brane pod uwagę?
0

Tylko małe pytanie: Po co do cholery najpierw zamieniasz bajt (a właściwie word) na char, żeby potem znowu go przetworzyć na bajta? Bo jak na mój rozum to nie ma sensu.

EDIT: Wytestowałem na lazarusie, 17 - Ctrl (nie ważne który), 16 - Shift (nie ważne który), 18 - Alt (nie ważne który).

Niestety przy lewym alcie, dopiero co drugie wciśnięcie jest zaliczane o.O

Wydaje mi się że wykonywane jest menu którego nie ma i jest zmieniany focus. Daj keypreviewa, powinno pomóc... No dobra, nie pomoże, ale pomoże ustawianie key:=0; .

0
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if ((GetKeyState(VK_LCONTROL) and 128) = 128) then
   ShowMessage('VK_LCONTROL'); //lewy control
 if ((GetKeyState(VK_RCONTROL) and 128) = 128) then
   ShowMessage('VK_RCONTROL'); //prawy control
 if ((GetKeyState(VK_LMENU) and 128) = 128) then
   ShowMessage('VK_LMENU'); //lewy alt
 if ((GetKeyState(VK_RMENU) and 128) = 128) then
   ShowMessage('VK_RMENU'); //prawy alt
end;

A z tym lewym ALT to nie wiem o co chodzi u mnie (na Windows XP) wykrywa każde wciśnięcie.

0

No jak wcisnę lewy alt, wychwyca, znowu, nie wychwyca, znowu wychwyca, znowu, nie wychwyca... it tak dalej.

1

Wolę rozwiązanie kAzka.

1

Nie, bo rozróżnia ctrl'e i alty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1