Während es keine weitere Antwort mehr gegeben hat habe ich mich durch gefühlte 1001 Links zum Thema Global Hooks etc. gewühlt.
Eine Lösung habe ich bekommen mit RegisterHotkey. Dabei fängt aber dann mein Programm eben die Taste der Fernbedienung ab und andere Programme, z.B. Mediaplayer, bekommen dann die Funktion nicht mehr mitgeteilt.
Ein globales Hooken mit eigener zusätzlicher
dll ist ebenfalls reichlich aufwendig.
Die Lösung, die nun genau das tut, was es soll, sieht so aus (dabei werden zwei externe Windows
API-Funktionen eingebunden):
Delphi-Quellcode:
type
TMainForm =
class(TForm)
...
private
ShellHookMessage: Integer;
protected
procedure WndProc(
var Message: TMessage);
override;
public
procedure StopMyPlayback;
procedure StartMyPlayback;
end;
var
MainForm: TMainForm;
function RegisterShellHookWindow(hWnd: hWnd): boolean;
stdcall;
external '
User32.dll'
name '
RegisterShellHookWindow';
function DeregisterShellHookWindow(hWnd: hWnd): boolean;
stdcall;
external '
User32.dll'
name '
DeregisterShellHookWindow';
implementation
{$R *.dfm}
procedure TMainForm.WndProc(
var Message: TMessage);
const
FAPPCOMMAND_MASK = $F000;
var
cmd: integer;
begin
inherited;
if (
Message.Msg = ShellHookMessage)
and (
Message.WParam = HSHELL_APPCOMMAND)
then
begin
cmd :=
Message.LParamHi
and not FAPPCOMMAND_MASK;
case cmd
of
APPCOMMAND_MEDIA_STOP: StopMyPlayback;
APPCOMMAND_MEDIA_PLAY: StartMyPlayback;
end;
end;
end;
procedure TMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
DeregisterShellHookWindow(
Handle);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
ShellHookMessage := RegisterWindowMessageA('
MYSHELLHOOK');
RegisterShellHookWindow(
Handle);
end;
Damit kommen die Kommandos der Fernbedienung an, egal ob das Programm im Vorergrund ist oder nicht. Und die Kommandos werden auch an andere Programme weitergereicht (so sie es denn sollen).
Vielleicht hilft der Code ja auch mal anderen.
Uli
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...