AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Auf Tastendruck von Media Center Fernbedienung reagieren

Auf Tastendruck von Media Center Fernbedienung reagieren

Ein Thema von Andreas L. · begonnen am 18. Mär 2010 · letzter Beitrag vom 18. Mär 2010
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 12:35
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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.224 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 13:22
Such mal nach "keyboard hook"
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.076 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 14:15
Versuchs mal hier:

http://msdn.microsoft.com/en-us/library/bb417079.aspx
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 15:34
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.
}
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 15:44
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
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 15:50
Zitat von shmia:
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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 16:11
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
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 16:17
Zitat von shmia:
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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Auf Tastendruck von Media Center Fernbedienung reagieren

  Alt 18. Mär 2010, 16:42
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)
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf