![]() |
Welche Nachricht bei Änderung der Lautstärke?
Ändert man per Software die Lautstärke, ändert sich augenblicklich der entsprechende Regler in der Lautstärkeregelung von Windows. Welche Nachricht muss man abfangen, um im eigenen Programm eine Lautstärkeänderung sofort nachzuvollziehen.
|
Re: Welche Nachricht bei Änderung der Lautstärke?
Aaaaaaaaaaaaaaalso, wenn ich dich richtig verstanden hab', willst du die aktuelle Lautstärkeeinstellung von der Windows (c) Lautstärkeregelung bekommen.
![]() Dazu folgende Unit benutzen:
Delphi-Quellcode:
und so an die Info rankommen:
{ Frei nach by Serhiy Perevoznyk }
unit Volume; interface Uses SysUtils, Windows, MMSystem; //////////////////////////////////////////////////////////////////////////////// function SetMasterVolume(Value: Cardinal) : boolean; function GetMasterVolume : Cardinal; //////////////////////////////////////////////////////////////////////////////// implementation //////////////////////////////////////////////////////////////////////////////// function InitMixer: HMixer; var Err: MMRESULT; begin Err := mixerOpen(@Result, 0, 0, 0, 0); if Err <> MMSYSERR_NOERROR then Result := 0; end; //////////////////////////////////////////////////////////////////////////////// function GetMasterVolumeControl(Mixer: hMixerObj; var Control: TMixerControl): MMResult; var Line : TMixerLine; Controls : TMixerLineControls; begin ZeroMemory(@Line, SizeOf(Line)); Line.cbStruct := SizeOf(Line); Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; Result := mixerGetLineInfo(Mixer, @Line, MIXER_GETLINEINFOF_COMPONENTTYPE); if Result = MMSYSERR_NOERROR then begin ZeroMemory(@Controls, SizeOf(Controls)); Controls.cbStruct := SizeOf(Controls); Controls.dwLineID := Line.dwLineID; Controls.cControls := 1; Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; Controls.cbmxctrl := SizeOf(Control); Controls.pamxctrl := @Control; Result := mixerGetLineControls(Mixer, @Controls, MIXER_GETLINECONTROLSF_ONEBYTYPE); end; end; //////////////////////////////////////////////////////////////////////////////// function SetMasterVolume(Value: Cardinal) : boolean; var MasterVolume : TMixerControl; Details : TMixerControlDetails; UnsignedDetails : TMixerControlDetailsUnsigned; Code : MMResult; Mixer : hMixerObj; begin Mixer := InitMixer; Result := false; Code := GetMasterVolumeControl(Mixer, MasterVolume); if(Code = MMSYSERR_NOERROR)then begin with Details do begin cbStruct := SizeOf(Details); dwControlID := MasterVolume.dwControlID; cChannels := 1; // set all channels cMultipleItems := 0; cbDetails := SizeOf(UnsignedDetails); paDetails := @UnsignedDetails; end; UnsignedDetails.dwValue := Value; if(mixerSetControlDetails(Mixer, @Details, MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then Result := true; end; end; //////////////////////////////////////////////////////////////////////////////// function GetMasterVolume : Cardinal; var MasterVolume : TMixerControl; Details : TMixerControlDetails; UnsignedDetails : TMixerControlDetailsUnsigned; Code : MMResult; Mixer : hMixerObj; begin Mixer := InitMixer; Result := 0; Code := GetMasterVolumeControl(Mixer, MasterVolume); if(Code = MMSYSERR_NOERROR)then begin with Details do begin cbStruct := SizeOf(Details); dwControlID := MasterVolume.dwControlID; cChannels := 1; // set all channels cMultipleItems := 0; cbDetails := SizeOf(UnsignedDetails); paDetails := @UnsignedDetails; end; if(mixerGetControlDetails(Mixer, @Details, MIXER_GETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then result := UnsignedDetails.dwValue; end; end; //////////////////////////////////////////////////////////////////////////////// function GetMasterMute( Mixer: hMixerObj; var Control: TMixerControl): MMResult; // Returns True on success var Line: TMixerLine; Controls: TMixerLineControls; begin ZeroMemory(@Line, SizeOf(Line)); Line.cbStruct := SizeOf(Line); Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; Result := mixerGetLineInfo(Mixer, @Line, MIXER_GETLINEINFOF_COMPONENTTYPE); if Result = MMSYSERR_NOERROR then begin ZeroMemory(@Controls, SizeOf(Controls)); Controls.cbStruct := SizeOf(Controls); Controls.dwLineID := Line.dwLineID; Controls.cControls := 1; Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; Controls.cbmxctrl := SizeOf(Control); Controls.pamxctrl := @Control; Result := mixerGetLineControls(Mixer, @Controls, MIXER_GETLINECONTROLSF_ONEBYTYPE); end; end; //////////////////////////////////////////////////////////////////////////////// function MuteMaster : boolean; var MasterMute: TMixerControl; Details: TMixerControlDetails; BoolDetails: TMixerControlDetailsBoolean; Code: MMResult; begin result := false; Code := GetMasterMute(0, MasterMute); if(Code = MMSYSERR_NOERROR)then begin with Details do begin cbStruct := SizeOf(Details); dwControlID := MasterMute.dwControlID; cChannels := 1; cMultipleItems := 0; cbDetails := SizeOf(BoolDetails); paDetails := @BoolDetails; end; mixerGetControlDetails(0, @Details, MIXER_GETCONTROLDETAILSF_VALUE); LongBool(BoolDetails.fValue) := not LongBool(BoolDetails.fValue); if(mixerSetControlDetails(0, @Details, MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then result := true; end; end; //////////////////////////////////////////////////////////////////////////////// end.
Delphi-Quellcode:
Die Lautstärke kann hierbei einen Wert zwischen 0 und 65535 annehmen!
procedure TForm1.Button1Click(Sender: TObject);
begin label1.caption := inttostr(GetMasterVolume); end; Gruß Calculon -- |
Re: Welche Nachricht bei Änderung der Lautstärke?
@calculon: Du hast es falsch verstanden. Er möchte mitbekommen wenn die Lautstärke geändert wurde. Daher will er wissen welche Window-Message ber Broadcast gesendet wird bzw. wie man eine Benachrichtigung erzhält (ohne Polling)
|
Re: Welche Nachricht bei Änderung der Lautstärke?
Richtig, ich möchte auf einen Timer verzichten, der ständig die aktuelle Lautstärke kontrolliert.
Nachdem ich ewig gesucht und diesen Thread gestartet habe, habe ich endlich ![]() |
Re: Welche Nachricht bei Änderung der Lautstärke?
Moin,
eventuell hilft sowas hier:
Delphi-Quellcode:
Ohne mixerOpen() geht es anscheinend nicht.
private
{ Private declarations } Procedure MixControlChange(var msg : TMessage); message MM_MIXM_CONTROL_CHANGE; Procedure MixLineChange(var msg : TMessage); message MM_MIXM_LINE_CHANGE; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} Procedure TForm1.MixControlChange(var msg : TMessage); begin beep;//DEMO end; Procedure TForm1.MixLineChange(var msg : TMessage); begin beep;//DEMO end; procedure TForm1.FormCreate(Sender: TObject); var Mix: HMIXER; begin mixerOpen(@Mix, 0, Handle, 0, CALLBACK_WINDOW); end; |
Re: Welche Nachricht bei Änderung der Lautstärke?
Liste der Anhänge anzeigen (Anzahl: 1)
Colin Wilson's
![]() demonstiert noch weitere Funktionen von MM_MIXM_CONTROLCHANGE wie Balance, Mute usw. Zitat:
|
Re: Welche Nachricht bei Änderung der Lautstärke?
Moin bitsetter, das hat geholfen. Habe eben im Test die Wave-Lautstärke ausgelesen. Dabei reicht mir bereits die Procedure MixControlChange. Ich habe nur die Variable Mix nach Private verschoben und beim FormDestroy ein mixerClose(Mix); eingetragen.
Das Callback aus oben genannten Thread hatte ich testweise in meine Form eingebaut. Es funktioniert dabei nur, wenn die Form aktiv ist. Heißt nach einer Änderung wurde das Callback ausgelöst, wenn auf die Form geklickt wurde. |
Re: Welche Nachricht bei Änderung der Lautstärke?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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