2017-10-24 1 views
1

Ich muss Master-Volume in Windows 10 ändern, aber ich kann nur die Lautstärke meiner Anwendung ändern. Jemand weiß, wie geht das in C?Master-Sound-Management-Fenster 10

Vielleicht Windows-API verwenden?

+1

Siehe [Endpoint Lautstärkeregler] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd370839 (v = VS.85) .aspx). –

+0

Ich habe ein Problem mit #include "Keine solche Datei oder Verzeichnis", aber ich lade es herunter, legte MinGW/include aber es ist das gleiche, und #include auch – Una

Antwort

3

Seit Windows Vista haben wir:

  1. Stream-Volume
  2. einfaches Volume
  3. Channel Volume
  4. Endpoint Volume

Sie müssen die endpoint volume ändern. Sie benötigen also die Schnittstelle IAudioEndpointVolume.

Die Schritte in dem folgenden Code ist ein IMMDeviceEnumerator zu erhalten. Mit dem Enumerator erhalten Sie das Standard-Audio-Ende mit GetDefaultAudioEndpoint. In der IAudioEndpointVolume Schnittstelle finden Sie Get/SetMasterVolumeLevel

Der folgende Beispielcode wird von Larry Osterman's blog genommen. Beachten Sie, dass keine Fehlerprüfung stattfindet.

#include <stdio.h> 
#include <windows.h> 
#include <tchar.h> 
#include <mmdeviceapi.h> 
#include <endpointvolume.h> 

void Usage() 
{ 
    printf("Usage: \n"); 
    printf(" SetVolume [Reports the current volume]\n"); 
    printf(" SetVolume -d <new volume in decibels> [Sets the current default render device volume to the new volume]\n"); 
    printf(" SetVolume -f <new volume as an amplitude scalar> [Sets the current default render device volume to the new volume]\n"); 

} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HRESULT hr; 
    bool decibels = false; 
    bool scalar = false; 
    double newVolume; 
    if (argc != 3 && argc != 1) 
    { 
    Usage(); 
    return -1; 
    } 
    if (argc == 3) 
    { 
    if (argv[1][0] == '-') 
    { 
     if (argv[1][1] == 'f') 
     { 
     scalar = true; 
     } 
     else if (argv[1][1] == 'd') 
     { 
     decibels = true; 
     } 
    } 
    else 
    { 
     Usage(); 
     return -1; 
    } 

    newVolume = _tstof(argv[2]); 
    } 

    // ------------------------- 
    CoInitialize(NULL); 
    IMMDeviceEnumerator *deviceEnumerator = NULL; 
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator); 
    IMMDevice *defaultDevice = NULL; 

    hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice); 
    deviceEnumerator->Release(); 
    deviceEnumerator = NULL; 

    IAudioEndpointVolume *endpointVolume = NULL; 
    hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); 
    defaultDevice->Release(); 
    defaultDevice = NULL; 

    // ------------------------- 
    float currentVolume = 0; 
    endpointVolume->GetMasterVolumeLevel(&currentVolume); 
    printf("Current volume in dB is: %f\n", currentVolume); 

    hr = endpointVolume->GetMasterVolumeLevelScalar(&currentVolume); 
    printf("Current volume as a scalar is: %f\n", currentVolume); 
    if (decibels) 
    { 
    hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL); 
    } 
    else if (scalar) 
    { 
    hr = endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL); 
    } 
    endpointVolume->Release(); 

    CoUninitialize(); 
    return 0; 
} 
+0

Danke dafür, aber Ich habe ein Problem: 'unbekannter Typname '_TCHAR'; meinst du 'PTCHAR'? ' – Una

+0

Nur' #include '. Geänderte Antwort – xMRi

+0

Es ist gut! Nun habe ich viele Fehler wie: 'expected expression before MMDeviceEnumerator' oder' 'IMMDeviceEnumerator {aka struct IMMDeviceEnumerator}' hat kein Member 'GetDefaultAudioEndpoint' | 'oder '' IMMDevice {aka struct IMMDevice} 'hat kein Mitglied namens' Activate '| ' – Una

Verwandte Themen