Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf Tastendruck von Media Center Fernbedienung reagieren (https://www.delphipraxis.net/149301-auf-tastendruck-von-media-center-fernbedienung-reagieren.html)

Andreas L. 18. Mär 2010 12:35


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:
procedure TForm6.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Memo1.Lines.Add('keydown: ' + IntToStr(Key));
end;
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?

EDIT: Im Lieferumfang war kein Treiber oder irgendein Dienstprogramm dabei. Im Netz hab ich auch nichts gefunden.

Grüße,
Andreas

Blup 18. Mär 2010 13:22

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Such mal nach "keyboard hook"

SubData 18. Mär 2010 14:15

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Versuchs mal hier:

http://msdn.microsoft.com/en-us/library/bb417079.aspx

Andreas L. 18. Mär 2010 15:34

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von SubData

Danke dafür. Leider sind manche Konstanten wie z. B. APPCOMMAND_MEDIA_PLAY in meinem Delphi 2009 falsch definiert. Im Code hat die Konstante den Wert 46, wenn ich die Taste drücke bekomme ich aber 4142. Muss ich jetzt wohl alle durch probieren.

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.
}

shmia 18. Mär 2010 15:44

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von Andreas L.
Leider sind manche Konstanten wie z. B. APPCOMMAND_MEDIA_PLAY in meinem Delphi 2009 falsch definiert. Im Code hat die Konstante den Wert 46, wenn ich die Taste drücke bekomme ich aber 4142. Muss ich jetzt wohl alle durch probieren.

Du musst das obere Wort aus LParam verwenden.
Delphi-Quellcode:
   WM_APPCOMMAND:
      ShowMessageFmt('App-Command %d', [Message.LParamHi]));

Andreas L. 18. Mär 2010 15:50

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von shmia
Zitat:

Zitat von Andreas L.
Leider sind manche Konstanten wie z. B. APPCOMMAND_MEDIA_PLAY in meinem Delphi 2009 falsch definiert. Im Code hat die Konstante den Wert 46, wenn ich die Taste drücke bekomme ich aber 4142. Muss ich jetzt wohl alle durch probieren.

Du musst das obere Wort aus LParam verwenden.
Delphi-Quellcode:
   WM_APPCOMMAND:
      ShowMessageFmt('App-Command %d', [Message.LParamHi]));

Ja, genau die Eigenschaft werte ich aus :-) Liegts vllt. an meiner Fernbedienung das die Taste einen anderen Wert hat?

shmia 18. Mär 2010 16:11

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von Andreas L.
Ja, genau die Eigenschaft werte ich aus :-)

Da fehlt noch eine Maske (FAPPCOMMAND_MASK)
Delphi-Quellcode:
const FAPPCOMMAND_MASK = $F000;
ShowMessageFmt('App-Command %d', [Message.LParamHi and not FAPPCOMMAND_MASK]));

Andreas L. 18. Mär 2010 16:17

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von shmia
Zitat:

Zitat von Andreas L.
Ja, genau die Eigenschaft werte ich aus :-)

Da fehlt noch eine Maske (FAPPCOMMAND_MASK)
Delphi-Quellcode:
const FAPPCOMMAND_MASK = $F000;
ShowMessageFmt('App-Command %d', [Message.LParamHi and not FAPPCOMMAND_MASK]));

Damit wird zwar die Play-Taste erkannt, nicht aber Pause:
Delphi-Quellcode:
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;
Kannst du noch erklären was es mit der Maske aufsich hat?

shmia 18. Mär 2010 16:42

Re: Auf Tastendruck von Media Center Fernbedienung reagieren
 
Zitat:

Zitat von Andreas L.
Kannst du noch erklären was es mit der Maske aufsich hat?

In LParam stecken gleich 3 Informationen drin.
Um diese rauszuholen stellt MS drei Makros bereit:
Code:
cmd = GET_APPCOMMAND_LPARAM(lParam);
uDevice = GET_DEVICE_LPARAM(lParam);
dwKeys = GET_KEYSTATE_LPARAM(lParam);
http://msdn.microsoft.com/en-us/libr...75(VS.85).aspx
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