AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Rückgabewert für Message WM_APPCOMMAND

Rückgabewert für Message WM_APPCOMMAND

Ein Thema von Andreas L. · begonnen am 10. Mai 2012 · letzter Beitrag vom 10. Mai 2012
Antwort Antwort
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Rückgabewert für Message WM_APPCOMMAND

  Alt 10. Mai 2012, 15:55
Hi,

in der WndProc-Methode reagiere ich auf das Ereignis WM_APPCOMMAND. Im MSDN steht man sollte auf diese Message True zurückliefern. Aber wie mache ich das? Ich dachte mir Message.Result zu setzen, aber mit welchem Wert? Ich kann ja nicht einfach ein Delphi-True in Integer konvertieren, API-Trues sind doch irgendwie anders.

Wisst ihr wie das geht?

MSDN ( http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx ):
Zitat:
Return value

If an application processes this message, it should return TRUE. For more information about processing the return value, see the Remarks section.

Remarks

...Unlike other windows messages, an application should return TRUE from this message if it processes it. Doing so will allow software that simulates this message on Windows systems earlier than Windows 2000 to determine whether the window procedure processed the message or called DefWindowProc to process it.
Delphi-Quellcode:
procedure TForm2.WndProc(var Message: TMessage);
begin
  inherited WndProc(Message);

  if (Message.Msg = WM_APPCOMMAND) then
  begin
    //...
  end;
end;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Rückgabewert für Message WM_APPCOMMAND

  Alt 10. Mai 2012, 16:35
Wisst ihr wie das geht?
Gemeint ist die Variable handled

Code:
procedure TForm1.WndProc(var Message: TMessage);
const
  WM_APPCOMMAND = $319;
  WM_APPCOMMAND_MEDIA_NEXTTRACK = 11; //Go to next track.
  WM_APPCOMMAND_MEDIA_PREVIOUSTRACK = 12; //Go to previous track.
  WM_APPCOMMAND_MEDIA_STOP = 13; //Stop playback.
  WM_APPCOMMAND_MEDIA_PLAY_PAUSE = 14; //Play or pause playback.
var
  Handled: boolean;
begin
  with Message do
  begin
    if (Msg = WM_APPCOMMAND) then
    begin
      case (LParamHi and $FFF) of
        WM_APPCOMMAND_MEDIA_STOP:
          begin
            frmNowPlaying.Stop();
            Handled := TRUE;
          end;
        WM_APPCOMMAND_MEDIA_PLAY_PAUSE:
          begin
            if FPlayerStatus = psPlay then
              frmNowPlaying.Pause()
            else
              frmNowPlaying.Play();
            Handled := TRUE;
          end;
        WM_APPCOMMAND_MEDIA_PREVIOUSTRACK:
          begin
            frmNowPlaying.Previous();
            Handled := TRUE;
          end;
        WM_APPCOMMAND_MEDIA_NEXTTRACK:
          begin
            frmNowPlaying.Next();
            Handled := TRUE;
          end;
      else
        { Unknown command - not handled here }
        Handled := FALSE;
      end;
      Result := LongInt(Handled);
    end
    else
      { Not WM_APPCOMMAND - we're not interested }
      inherited;
  end;
end;
Weitere Einzelheiten dazu gab es hier. Leider aber seit einiger Zeit off.
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Rückgabewert für Message WM_APPCOMMAND

  Alt 10. Mai 2012, 17:05
Boolean in LongInt casten und in Message-Result setzen. Das war das was ich wissen musste. Danke

EDIT: Genau so wie du frage ich WM_APPCOMMAND ab um die Sondertasten von Tastaturen sowie die Knöpfe von Windows Media Fernbedienungen abzufragen. Das funktioniert soweit auch alles. Nur wird bei den Lautstärke leiser/lauter die System-Lautstärke geändert. Ich dachte das würde Windows durch den Rückgabewert nun unterlassen. Leider ist dem nicht so. Weiß jemand wie ich Windows sage "Lass die Sys-Lautstärke in Ruhe mein Programm verändert seine eigene Lautstärke-Regelung" so wie es z. B. iTunes auch macht?

Delphi-Quellcode:
 TCsWindowsAppCommand = (
    cwacVolumeMute = APPCOMMAND_VOLUME_MUTE,
    cwacVolumeDown = APPCOMMAND_VOLUME_DOWN,
    cwacVolumeUp = APPCOMMAND_VOLUME_UP,
    cwacMediaPlay = APPCOMMAND_MEDIA_PLAY
  );

procedure TForm2.WndProc(var Message: TMessage);
var
  cmd: TCsWindowsAppCommand;
begin

  if (Message.Msg = WM_APPCOMMAND) then
  begin
    cmd := TCsWindowsAppCommand(GET_APPCOMMAND_LPARAM(Message.LParam));
    case cmd of
      cwacMediaPlay: ListBox1.Items.Add('Play');
      cwacVolumeDown: ListBox1.Items.Add('Vol down');
      cwacVolumeUp: ListBox1.Items.Add('Vol up');
    end;
    Message.Result := LongInt(True);
  end
  else
    Message.Result := LongInt(False);

  inherited WndProc(Message);
end;
EDIT 2: Problem gelöst. inherited WndProc(); darf - wie in deinem Code - nur aufgerufen werden wenn es sich um keine WM_APPCOMMAND-Nachricht handelt.
Andreas Lauß
Blog

Geändert von Andreas L. (10. Mai 2012 um 17:39 Uhr)
  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 22:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz