![]() |
Auf Tastendruck von Media Center Fernbedienung reagieren
Hi,
ich habe eine Infrarot Media Center Fernbedienung von Microsoft (Model 1039). Der Empfänger ist über USB angeschlossen, Windows (sowohl XP als auch Vista) hat automatisch den Treiber installiert. Mit iTunes und dem Windows Media Player funktioniert die Fernbedienung fast einwandfrei. Jetzt wollte ich mit meinem Delphi Programm auf einen Tastendruck reagieren und hab dazu einen Button genommen und folgendes KeyDown-Ereignis erstellt:
Delphi-Quellcode:
Wenn der Button fokusiert ist und ich eine der Tasten drücke erhalte ich auch eine Ausgabe im Memo, z. B. 176 für den Weiter-Knopf. Leider gehts nicht mit allen Knöpfen: Lauter und Leise, Stopp, Zurück, Weiter, FWD, REW, Ton aus sowie der Ziffernblock funkioniert. Die Play, Pause, Aufnahme oder eine der Systemtasten (TV an/aus, PC an/aus) gehen leider nicht. Auch nicht im OnKeyPress-Ereignis. iTunes zum Beispiel reagiert auf die Play und Pause Taste schon, nicht aber auf den Ziffernblock. Hat sich damit schon jemand befasst? Wie kann ich auf wirklich alle Tasten reagieren?
procedure TForm6.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin Memo1.Lines.Add('keydown: ' + IntToStr(Key)); end; EDIT: Im Lieferumfang war kein Treiber oder irgendein Dienstprogramm dabei. Im Netz hab ich auch nichts gefunden. Grüße, Andreas |
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Such mal nach "keyboard hook"
|
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
|
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
Aber eine Sache hab ich noch nicht verstanden. Auf der MS-Seite steht das ich ein RID registrieren muss um auf WM_INPUT reagieren zu können. Ähm.. wie mach ich das? mit dem Code kann ich nicht viel anfangen: BTW: Werden dafür Adminrechte benötigt?
Code:
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0xFFBC; Rid[0].usUsage = 0x88; Rid[0].dwFlags = 0; if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { ErrorExit(); // Add error-handling code here. } |
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
Delphi-Quellcode:
WM_APPCOMMAND:
ShowMessageFmt('App-Command %d', [Message.LParamHi])); |
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
|
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
Delphi-Quellcode:
const FAPPCOMMAND_MASK = $F000;
ShowMessageFmt('App-Command %d', [Message.LParamHi and not FAPPCOMMAND_MASK])); |
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
Delphi-Quellcode:
Kannst du noch erklären was es mit der Maske aufsich hat?
procedure TForm6.WndProc(var Message: TMessage);
const FAPPCOMMAND_MASK = $F000; begin inherited WndProc(Message); if (Message.Msg = WM_APPCOMMAND) then begin with TStringList.Create do try if FileExists(ExtractFilePath(ParamStr(0)) + 'test.log') then LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.log'); Add(IntToStr(Message.Msg)); Add(IntToStr(Message.WParam)); Add(IntToStr(Message.LParam)); Add(IntToStr(Message.Result)); Add(IntToStr(Message.WParamLo)); Add(IntToStr(Message.WParamHi)); Add(IntToStr(Message.LParamLo)); Add(IntToStr(Message.LParamHi)); Add(IntToStr(Message.ResultLo)); Add(IntToStr(Message.ResultHi)); case (Message.LParamHi and not FAPPCOMMAND_MASK) of APPCOMMAND_MEDIA_NEXTTRACK: Add('NEXT'); APPCOMMAND_MEDIA_PREVIOUSTRACK: Add('PREVIOUS'); APPCOMMAND_MEDIA_STOP: add('stop'); APPCOMMAND_MEDIA_PLAY_PAUSE: add('play/pause'); //wird nicht erkannt APPCOMMAND_MEDIA_PLAY: add('play'); //wird erkannt APPCOMMAND_MEDIA_RECORD: add('record'); end; Add('---'); SaveToFile(ExtractFilePath(ParamStr(0)) + 'test.log'); finally Free; end; end; end; |
Re: Auf Tastendruck von Media Center Fernbedienung reagieren
Zitat:
Um diese rauszuholen stellt MS drei Makros bereit:
Code:
cmd = GET_APPCOMMAND_LPARAM(lParam);
uDevice = GET_DEVICE_LPARAM(lParam); dwKeys = GET_KEYSTATE_LPARAM(lParam); ![]() Als Delphi-Programmierer hat man diese Makros leider nicht und muss dann die Einteile selbst rausholen.
Code:
#define FAPPCOMMAND_MOUSE 0x8000
#define FAPPCOMMAND_KEY 0 #define FAPPCOMMAND_OEM 0x1000 #define FAPPCOMMAND_MASK 0xF000 #define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK)) #define GET_DEVICE_LPARAM(lParam) ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK)) #define GET_MOUSEORKEY_LPARAM GET_DEVICE_LPARAM #define GET_FLAGS_LPARAM(lParam) (LOWORD(lParam)) #define GET_KEYSTATE_LPARAM(lParam) GET_FLAGS_LPARAM(lParam) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz