[Delphi] Kody dodatkowych klawiszy z klawiatury mmedialnej..

0

Już kiedyś (click!) pisałem (na forum KŚE) o problemi z dodatkowymi klawiszami klawiatury multimedialnej pod Windows 98.
Postanowiłem pobrać kod wciśniętego klawisza w Delphi, ale żaden ze znalezionych przeze mnie kodów (m.in. standardowe eventy onKey... obiektu, globalne hooki na klawiaturę itp.) nie działa tak, by mnie satysfakcjonował - funkcje owszem, zwracają kod klawisza, ale jest on zawsze równy 255 i to niezależnie od wciśniętego klawisza. Jednak wiem na pewno, że one wywołują jakieś przerwania (?), gdyż po odpaleniu "sterowników" niektóre klawisze działają prawidłowo (tj. Mute, Vol+/- i Home).
Jednak pragnę sam je oprogramować, ale bez ich "danych" nic nie zrobię.

Czy może ktoś mógłby mi pomóc?

PS Temat również na Forum czasopisma Komputer Świat Ekspert</url>

0

Nie wiem czy to wina Windows 98, ale OnKeyDown/OnKeyUp powinny działać poprawnie. Przykład:

const VK_VOLUME_DOWN = $AE;
      VK_VOLUME_UP = $AF;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_VOLUME_DOWN then
  ShowMessage('Zmniejszono głośność');
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_VOLUME_UP then
  ShowMessage('Zwiększono głośność');
end;

Lista kodów klawiszy

0

Nie wiem, czy uważnie przeczytałeś mój post, ale już wspomniałem, że próbowałem przez te eventy (onKeyDown/Up) i zawsze zwracana była wartość 255. Więc takie sposoby nie przejdą.
Poza tym, nie wiem czy przeczytałeś co piszą na MSDN'ie :P

MSDN napisał(a)

VK_VOLUME_DOWN (AE)
Windows 2000/XP: Volume Down key

VK_VOLUME_UP (AF)
Windows 2000/XP: Volume Up key
(siedzę pod 98) :P

A tak w ogóle to wreszcie pobawiłem się komunikatami i przedstawiam mini raporcik :)
Po zapoznaniu się z różnymi FAQ, pomocami itp. postanowiłem sprawdzić wyniki wartości lParam, komunikatu WM_KEYDOWN. Okazało się, że owe dodatkowe klawisze mają wartość całkowicie inną niż inne przyciski :)

Oto co zmajstrowałem (przy pomocy 4p):

type
  TForm1 = class(TForm)
// ...
  private
    procedure gettamsg(var Msg : TMsg; var Handled: Boolean);
// ...
implementation
// ...
procedure TForm1.gettamsg(var Msg: TMsg; var Handled: Boolean);
begin
 if (Msg.message=$0100) //WM_KEYDOWN
  then ListBox.Items.Add( IntToStr(Msg.lParam) );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := gettamsg;
end;

Teraz wystarczy założyć globalnego hooka i oprogramować wyniki eventu :)
Dzięki wszystkim za pomoc i mobilizację ;)

PS Prosiłbym o komentarze, czy wymyślony przeze mnie sposób jest prawidłowy, oraz inne plusy i minusy tego sposobu :)</quote>

0

Nie przechwycisz wciśnięcia, jeśli aplikacja będzie nieaktywna (Brak focusa). Jeśli chcesz przechwytywać też, gdy aplikacja jest nieaktywna, skorzystaj z hooków.

0

Sorry, ale zrzucę moją nieuwagę na późną godzinę nocną.

Plusy i minusy - hmm..
Ty odczytujesz ScanCode (zależny od sprzętu i ustawienia sterowników), który dla różnych układów klawiatury może być różny (rzadko jest, ale dla osoby z klawiaturą azjatycką na przykład to może nie zadziałać). Po drugie sprawdź, czy przejmując klawisz przez hook otrzymasz tą samą wartość na Windows XP, co u siebie na 98.

A tak poza tym, ma to znamiona poprawności.

0
nav napisał(a)

Nie przechwycisz wciśnięcia, jeśli aplikacja będzie nieaktywna (Brak focusa). Jeśli chcesz przechwytywać też, gdy aplikacja jest nieaktywna, skorzystaj z hooków.

Nie wiem, czy zauważyłeś, ale napisałem

Teraz wystarczy założyć globalnego hooka i oprogramować wyniki eventu
:P

@Szczawik: zgadzam się, różnie to będzie na odmiennych platformach. Ale wątpię, by wszyscy mieli identyczną klawiaturę jak ja, czyli identyczne klawisze :P (w/w zarys jest przecież tylko do mojego użytku :P).
Myśląc przyszłościowo o uniwersalnej aplikacji-sterowniku do klawiatury, to raczej użytkownik będzie miał pola, które rozpoznają wciśnięty klawisz, a w innym polu będzie wybierał co ma się dziać, po wciśnięciu danego klawisza...

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