TMuterForm = class(TForm)
. . .
private
{ Private-Deklarationen }
deviceEnumerator: IMMDeviceEnumerator; // Interface-Pointer, Interface ist in MMDevApi definiert; ..wird im Prog als erster ermittelt
defaultDevice: IMMDevice; // Interface-Pointer, Interface ist in MMDevApi definiert; ..wird im Prog als zweites ermittelt
endpointVolume: IAudioEndpointVolume; // Interface-Pointer, Interface ist in MMDevApi definiert; ..wird im Prog dann als drittes ermittelt
MuteIsOnStream, MuteIsOffStream : TMemoryStream; <---------- beim Zugriff auf diese Vars entstehen die ersten Exceptions
MuteStatus : boolean; <---------- danach beim Zugriff auf diese hier, anschließend (wenn ich die jeweils zu globalen Var mache) beim Zugriff auf Button1.Caption
HookHandle : Cardinal;
StartXY : TPoint;
Seconds : integer;
EndTickCount : DWord;
procedure manageButtonCaptions;
public
. . .
procedure TMuterForm.FormCreate(Sender: TObject);
var
aTop, aLeft : integer;
begin
// Die drei ersten Anweisungen haben einen Pointer auf ein IAudioEndpointVolume-Interface zu ermitteln, über dessen Methoden dann alle Volume-Aktionen auszuführen sind
// kreiert ein "IMMDeviceEnumerator"-Objekt (siehe MMDevApi-
Unit unten), "deviceEnumerator" zeigt dann anschließend darauf (wird nur für die nächste Codezeile benötigt)
CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
// diese "GetDefaultAudioEndpoint"-Methode des "IMMDeviceEnumerator"-Objektes besorgt dann ein "IMMDevice"-Objekt (siehe MMDevApi-
Unit etwa mitte), "defaultDevice" zeigt dann anschließend darauf (wird ebenfalls wiederum nur für die nächste Codezeile benötigt)
deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
// diese "Activate"-Methode des "IMMDevice"-Objektes besorgt dann ein "IAudioEndpointVolume"-Objekt (siehe MMDevApi-
Unit etwa Anfang der Interface-Deklarationen), "endpointValume" zeigt dann anschließend darauf
//_und mit den Methoden dieses "IAudioEndpointVolume"-Objektes, gepointet durch "endpointVolume", werden dann die jeweiligen Volume-Aktionen ausgeführt
defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
. . .
DIE INTERFACE-
UNIT:
unit MMDevApi;
interface
uses
Windows,
ActiveX, ComObj;
const
CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
DEVICE_STATE_ACTIVE = $00000001;
DEVICE_STATE_UNPLUGGED = $00000002;
DEVICE_STATE_NOTPRESENT = $00000004;
DEVICE_STATEMASK_ALL = $00000007;
type
EDataFlow = TOleEnum;
const
eRender = $00000000;
eCapture = $00000001;
eAll = $00000002;
EDataFlow_enum_count = $00000003;
type
ERole = TOleEnum;
const
eConsole = $00000000;
eMultimedia = $00000001;
eCommunications = $00000002;
ERole_enum_count = $00000003;
type
IAudioEndpointVolumeCallback = interface(IUnknown)
['{657804FA-D6AD-4496-8A60-352752AF4F89}']
end;
IAudioEndpointVolume = interface(IUnknown)
['{5CDF2C82-841E-4546-9722-0CF74078229A}']
function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
function GetChannelCount(out PInteger): Integer; stdcall;
function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
function GetMute(out bMute: Boolean): Integer; stdcall;
function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; 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: EDataFlow; 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;
implementation
end.