So, bin jetzt etwas weiter gekommen, habe den Code wie folgt geändert:
Delphi-Quellcode:
type
TForm1 = class(TForm)
procedure MediaKey(var Msg: TMessage); message WM_APPCOMMAND;
end;
{...}
procedure TForm1.MediaKey(var Msg: TMessage);
begin
case Msg.lParam of
$B0000: // APPCOMMAND_MEDIA_NEXTTRACK
begin
ShowMessage('Nächste Folie');
Msg.Result := 1;
end;
$C0000: // APPCOMMAND_MEDIA_PREVIOUSTRACK
begin
ShowMessage('Vorherige Folie');
Msg.Result := 1;
end;
$E0000: // APPCOMMAND_MEDIA_PLAY_PAUSE
begin
ShowMessage('Leere Folie');
Msg.Result := 1;
end;
end;
end;
Jetzt wird die Meldung nur noch einmal angezeigt, da durch
Result := 1 Windows mitgeteilt wurde, dass das Programm die Eingabe verarbeitet hat.
Dass die Meldung auch angezeigt wird, wenn das Programm nicht den Fokus hat, klappt allerdings nur wenn das Fenster offen ist (z.B. hinter einem anderen Fenster liegt, dass diese Eingabe nicht verarbeitet hat), wenn mein Fenster minimiert ist, klappt es nicht mehr (die Eingabe kommt nicht an).
Da jedoch z.B. der Windows Media Player diese Eingabe auch bekommt wenn er minimiert ist (z.B. "Nächster Titel" wenn der Player grad minimiert ist), habe ich mal meine Vermutung aufgestellt:
1. Das Fenster, welches gerade im Vordergrund ist, bekommt die Eingabe. Wird die Eingabe nich verarbeitet (nicht Result := 1), dann
2. Die Eingabe wird nacheinander an alle geöffneten Fenster geschickt (jedoch keine minimierten). Wenn die Eingabe immer noch nicht verarbeitet wurde, dann
3. Wird eine Liste von Programmen durchgegangen, die diese Eingabe erhalten (so z.B. der Windows Media Player). Übrigens wird der sogar mit der Play/Pause Taste gestartet, wenn er überhaupt nicht läuft! Wurde die Eingabe immer noch nicht verarbeitet, dann
4. Gibt es laut
MSDN einen Shell Hook mit dem Code HSHELL_APPCOMMAND.
Da 1 und 2 nur bei geöffnetem Fenster geht und ich natürlich gerne mein Programm minimieren würde, um die Eingaben umzuwandeln, wäre die beste Lösung wenn ich irgendwie herausfinden könnten, wie das mit der Liste der Programme funktioniert. Gibt es eine solche Liste? Wo ist die? Kann ich da einfach mein Programm in diese Liste hinzufügen? Oder gibts vielleich ein Attribut eines Programms, das aussagt, dass es sich um ein Muldimedia-Programm handelt, wie z.B. beim WMP, und dass dann die Eingabe an alle "Multimedia-Programme" gesendet wird?
Ansonsten wäre es interessant zu wissen, wie das mit dem Shell Hook funktioniert. Davon habe ich keine Ahnung...
Wobei sich mir die Frage stellt, da z.B. die Play/Pause schon in Schritt 3
immer an den WMP gesendet wird (?), ob es dann überhaupt zu dem Shell Hook kommt ?!?
Wäre wirklich super, bin im Moment absolut ratlos, wie ich diese Media-Tasten global abfangen kann...
Dieser Thread hat mir leider auch nicht wirklich geholfen, da hier keine Lösung angeboten wird... (hab ihn erst entdeckt, nachdem ich das Thema eröffnet hatte)