Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rückgabewert für Message WM_APPCOMMAND (https://www.delphipraxis.net/168236-rueckgabewert-fuer-message-wm_appcommand.html)

Andreas L. 10. Mai 2012 14:55

Rückgabewert für Message WM_APPCOMMAND
 
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;

ASM 10. Mai 2012 15:35

AW: Rückgabewert für Message WM_APPCOMMAND
 
Zitat:

Zitat von Andreas L. (Beitrag 1165911)
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.

Andreas L. 10. Mai 2012 16:05

AW: Rückgabewert für Message WM_APPCOMMAND
 
Boolean in LongInt casten und in Message-Result setzen. Das war das was ich wissen musste. Danke :thumb:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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