Einzelnen Beitrag anzeigen

UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: WndProc bei Programmen im Hintergrund

  Alt 5. Jul 2013, 11:09
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.dllname 'RegisterShellHookWindow';
function DeregisterShellHookWindow(hWnd: hWnd): boolean; stdcall; external 'User32.dllname '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 ...
  Mit Zitat antworten Zitat