AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WndProc bei Programmen im Hintergrund
Thema durchsuchen
Ansicht
Themen-Optionen

WndProc bei Programmen im Hintergrund

Ein Thema von UliBru · begonnen am 4. Jul 2013 · letzter Beitrag vom 8. Jul 2013
 
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
 


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 12:42 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