2013-05-21 10 views
5

ich diesen Code bin mit/unmute System Master-Lautstärke stumm zu schalten:Wie kann überprüft werden, ob die Systemhauptlautstärke stummgeschaltet ist oder die Stummschaltung aufgehoben ist?

const 
    APPCOMMAND_VOLUME_MUTE = $80000; 
    WM_APPCOMMAND = $319; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    // toggle mute/unmute 
    SendMessageW(Handle, WM_APPCOMMAND, Handle, APPCOMMAND_VOLUME_MUTE); 
end; 

(Code https://stackoverflow.com/a/154128/1140885 Got)

Es auf XP funktioniert gut (Habe es bisher nicht testen auf Win7 noch) nicht.
Ich brauche eine Methode zu überprüfen (get) Was ist der aktuelle "stumm" Zustand? Ist es stumm oder nicht?
Irgendwelche Ideen?


Update: Für XP ich den Code am Ende mit von hier:

mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; 

: How to get the master volume in windows xp? (Dank @Sertac Akyuz)

ich nur eine einzige Zeile zu ändern, hatte zu:

mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; 

Rückgabewert ist entweder 0 (nicht stumm) oder 1 (stumm).

+0

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/ 0152ff8a-0d1c-4cad-b7cd-32d18ea9975d –

+0

http://support.microsoft.com/kb/118377 – OnTheFly

Antwort

11

Beginnend mit Windows Vista müssen Sie die Core Audio SDK verwenden, um das Windows-Audio zu steuern. Um zu überprüfen, ob das Master-Volume stummgeschaltet ist, müssen Sie die Methode IAudioEndpointVolume.GetMute verwenden.

Versuchen Sie diesen Beispielcode

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, 
    ActiveX, 
    ComObj; 

const 
    CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}'; 
    IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}'; 
    IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}'; 

type 
    IAudioEndpointVolumeCallback = interface(IUnknown) 
    ['{657804FA-D6AD-4496-8A60-352752AF4F89}'] 
    end; 

    IAudioEndpointVolume = interface(IUnknown) 
    ['{5CDF2C82-841E-4546-9722-0CF74078229A}'] 
    function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall; 
    function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall; 
    function GetChannelCount(out PInteger): HRESULT; stdcall; 
    function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall; 
    function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall; 
    function GetMasterVolumeLevel(out fLevelDB: single): HRESULT; stdcall; 
    function GetMasterVolumeLevelScaler(out fLevelDB: single): HRESULT; stdcall; 
    function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): HRESULT; stdcall; 
    function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): HRESULT; stdcall; 
    function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): HRESULT; stdcall; 
    function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): HRESULT; stdcall; 
    function SetMute(bMute: Boolean; pguidEventContext: PGUID): HRESULT; stdcall; 
    function GetMute(out bMute: Boolean): HRESULT; stdcall; 
    function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): HRESULT; stdcall; 
    function VolumeStepUp(pguidEventContext: PGUID): HRESULT; stdcall; 
    function VolumeStepDown(pguidEventContext: PGUID): HRESULT; stdcall; 
    function QueryHardwareSupport(out pdwHardwareSupportMask): HRESULT; stdcall; 
    function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): HRESULT; stdcall; 
    end; 

    IAudioMeterInformation = interface(IUnknown) 
    ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}'] 
    end; 

    IPropertyStore = interface(IUnknown) 
    end; 

    IMMDevice = interface(IUnknown) 
    ['{D666063F-1587-4E43-81F1-B948E807363F}'] 
    function Activate(const refId: TGUID; dwClsCtx: DWORD; pActivationParams: PInteger; out pEndpointVolume: IAudioEndpointVolume): HRESULT; stdCall; 
    function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): HRESULT; stdcall; 
    function GetId(out ppstrId: PLPWSTR): HRESULT; stdcall; 
    function GetState(out State: Integer): HRESULT; stdcall; 
    end; 


    IMMDeviceCollection = interface(IUnknown) 
    ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'] 
    end; 

    IMMNotificationClient = interface(IUnknown) 
    ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}'] 
    end; 

    IMMDeviceEnumerator = interface(IUnknown) 
    ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'] 
    function EnumAudioEndpoints(dataFlow: TOleEnum; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): HRESULT; stdcall; 
    function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice): HRESULT; stdcall; 
    function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HRESULT; stdcall; 
    function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): HRESULT; stdcall; 
    end; 

function IsMasterVolumeMute : Boolean; 
var 
    pEndpointVolume: IAudioEndpointVolume; 
    LDeviceEnumerator: IMMDeviceEnumerator; 
    Dev: IMMDevice; 
    bMute: Boolean; 
begin 
    if not Succeeded(CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, LDeviceEnumerator)) then 
    RaiseLastOSError; 
    if not Succeeded(LDeviceEnumerator.GetDefaultAudioEndpoint($00000000, $00000000, Dev)) then 
    RaiseLastOSError; 

    if not Succeeded(Dev.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, pEndpointVolume)) then 
    RaiseLastOSError; 

    if not Succeeded(pEndpointVolume.GetMute(bMute)) then 
    RaiseLastOSError 
    else 
    Result:=bMute; 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     Writeln(Format('Master Volume is Mute ? : %s',[BoolToStr(IsMasterVolumeMute, True)])); 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+1

Der 'GetMute'-Methode Parameter sollte' BOOL' statt 'Boolean' sein. Ebenso für' SetMute'. –

2

Verwendung dieses i getestet und die Arbeit für me.this überprüfen und einstellen Master-Volume werden. (erhalten von http://www.swissdelphicenter.ch/torry/showcode.php?id=1630) ich hoffe diese Hilfe.

uses 
     MMSystem; 

    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; 

    procedure SetMasterMuteValue(
     Mixer: hMixerObj; 
     Value: Boolean); 
    var 
     MasterMute: TMixerControl; 
     Details: TMixerControlDetails; 
     BoolDetails: TMixerControlDetailsBoolean; 
     Code: MMResult; 
    begin 
     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; 
     LongBool(BoolDetails.fValue) := Value; 
     Code := mixerSetControlDetails(0, @Details, 
    MIXER_SETCONTROLDETAILSF_VALUE); 
     end; 
     if Code <> MMSYSERR_NOERROR then 
     raise Exception.CreateFmt('SetMasterMuteValue failure, '+ 
      'multimedia system error #%d', [Code]); 
    end; 

    // Example: 

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
     SetMasterMuteValue(0, CheckBox1.Checked); // Mixer device #0 mute on/off 
    end; 
+1

'GetMasterMute 'gibt bei Erfolg 0 zurück, nicht 'True'. Dieser Code * setzt * die Masterlautstärke stumm.Es ist ein schöner Code, aber ich sehe nicht, wie man * bekommt * (überprüfen), ob die Master-Lautstärke stumm ist oder nicht. – ZigiZ

+0

+1 für mich auf MMSystem API. – ZigiZ

+0

Funktion GetMasterMute (Mixer: hMixerObj; var Steuerung: TMixerControl): MMResult; // Rückgabe bei Erfolg –

1

Der Parameter sollte die GetMute Methode BOOL eher als Boolean. Gleiches gilt für SetMute. -

Nun, das ist zu sagen .. Ja und Nein .. Ja Ein Delphi BOOL (eigentlich ein LongBool) kann ein C-BOOL speichern. Nein, weil es nicht zum Schreiben in eine C-BOOL-Eigenschaft verwendet werden kann. Sie erhalten ein 0x80070057 = "Wrong Parameter" Ergebnis.

Der einfache Grund ist, dass in Delphi True "alles außer 0" bedeutet und -1 darstellt. A C-BOOL True, jedoch stellt 1 und nur 1 dar.

Also, die Verwendung eines LongBool funktioniert nicht und Sie sollten eine Problemumgehung mit einem INT, LongInt, Integer oder eigenen eigenen definierten "BOOL" zu vermeiden "Falsche Parameter" Ergebnisse.

Hier ein Beispiel (die 10.0.10586.15 in Delphi XE7 und getestet mit SDK-Version funktioniert:

// Workaround for BOOL 
type TcBOOL = (cFalse = Integer(0), 
       cTrue = Integer(1)); 

// IAudioEndpointVolume 
function SetMute(bMute: BOOL; pguidEventContext: PGUID): HRESULT; stdcall; 
function GetMute(out pbMute: BOOL): HRESULT; stdcall; 


// Client functions 
function TMfpMixer.GetMute(): TcBOOL; 
var 
    hr: HResult; 
    Res: BOOL; 

begin 
    hr:= FAudioEndpoint.GetMute(Res); 

    if FAILED(hr) then 
    OleCheck(hr); 

    Result:= TcBOOL(Res); 
end; 

// 
procedure TMfpMixer.SetMute(Value: TcBOOL); 
var 
    hr: HResult; 

begin 
    // This is a workaround on the Delphi BOOL issue. 
    hr:= FAudioEndpoint.SetMute(BOOL(Value), 
           Nil); 
    OleCheck(hr); 
end; 
Verwandte Themen