Jak uzyskać dostęp do poziomów głośności z wiersza poleceń w systemie Windows 7?

17

Czego potrzebuję

Szukam narzędzia lub skryptu, który pozwoli mi uzyskać dostęp do poziomów głośności systemu Windows z wiersza polecenia. Idealnie pozwoliłoby mi to uzyskać i ustawić wszystkie woluminy, w tym poziomy aplikacji, ale zadowoliłbym się tylko uzyskaniem i tylko poziomem głównym. Nie mam nic przeciwko, jeśli używa PowerShell, WMI, JavaScript, .Net, Voodoo, czy motyle. Każde rozwiązanie, które da mi tylko numer, który mogę dalej przetwarzać w celu dopasowania zakresu od 0% do 100%, wystarczy.

Innymi słowy, podpowiedzi to czarna skrzynka, którą muszę wypełnić:

C:\> getvol master
50

lub nawet

C:\> wmic <alias> where "device='master' and name='volume'" get name,value
Name    Value
Volume  0xDEADBEEF

Nie przeszkadza mi to, że muszę poświęcić trochę czasu, aby to owinąć, a nawet sam napisać coś, jeśli narzędzia do tego są dostępne bezpłatnie. W tym drugim przypadku potrzebowałbym kilku wskaźników / proof-of-concept dla rdzenia, ale mogę samodzielnie zarządzać cruft. Chciałbym również unikać instalowania nowych ram programistycznych tylko w tym celu (zwróć uwagę, że odpowiedzi zarówno music2myear, jak i iglvzx zostały podane przed wprowadzeniem tych wymagań).

Jako „platformy” mam dostępne:

  • wszystko, co pochodzi z Windows 7 Home Premium
  • wszystko, co pochodzi z Cygwin
  • Perl
  • Pyton
  • Rubin

Zasadniczo preferowane są rozwiązania typu open source. Narzędzia z zamkniętym źródłem są w porządku, pod warunkiem, że są bezpłatne i źródłu można zaufać. Rozwiązań komercyjnych nie da się.

Czego nie potrzebuję

  • Istnieje kilka podobnych pytań, które w większości dotyczą ustawiania głośności. Przede wszystkim muszę uzyskać głośność, a nie ustawić.
  • Istnieje nircmdc, który obsługuje ustawianie głośności, ale nie jest uzyskiwanie.
  • W moim rejestrze jest klucz [1], który ma wartości, które zmieniają się przewidywalnie, kiedy dostosowuję głośność za pomocą miksera GUI, ale zgaduję, że czytanie tego klucza jest podatne na uszkodzenie przy zmianach sprzętowych lub aktualizacjach systemu. O ile nie mogę polegać na tym, że rozwiązanie jest wystarczająco przyszłościowe, nie mogę go użyć.
  • Istnieją AutoHotKeyi WSHrozwiązania do ustawiania głośności w Internecie, ale a) one także są dobre tylko do ustawienia, a co gorsza, b) używają SendKeyslub zautomatyzowanego ruchu myszy do sterowania GUI. Automatyzacja GUI nie jest opcją.

##windowsKanał na freenode jest nieprzydatny, jak zawsze, Google przepełnia hacki i połowiczne obejścia, a ja nie mogę powiedzieć wywołanie WinAPI z Wiccaninem inkantacji.

Czy ktoś zna sposób?


  1. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E96C-E325-11CE-BFC1-08002BE10318}\0000\MixerSettings\eLineOutTopo\PrimaryNode000
peth
źródło
Semmy takie jak WMI nie są opcją :(
Der Hochstapler
Prawdopodobnie istotne: superuser.com/questions/284527/…
Der Hochstapler
Czy potrzebujesz mnie, aby rozwinąć moją odpowiedź? Nie byłem pewien, czy potrzebujesz więcej, ponieważ wydaje ci się, że masz doświadczenie w programowaniu. Mogę podać przykład wykorzystania AutoHotkey do łatwego osiągnięcia celu.
iglvzx
Myślę, że to bardzo dobra sugestia, jeszcze raz dziękuję, ale AHK ugryzł mnie raz i od tego czasu jestem nieśmiały. Prawdopodobnie nie użyłbym tego, nawet gdyby było to w pełni rozwinięte rozwiązanie. Jednak nic nie powstrzymuje Cię przed rozszerzeniem go o przyszłych czytelników / więcej pozytywnych opinii. :)
peth
1
(jako uwaga, że ​​reg. nawet nie wydaje się istnieć na moim pudełku, więc ... może być rzeczywiście niestabilny). Zobacz także moją odpowiedź c ++ tutaj: stackoverflow.com/a/21056089/32453
rogerdpack

Odpowiedzi:

5

To pytanie zostało zadane i udzielono odpowiedzi na StackOverflow: /programming/4640106/how-to-get-current-volume-of-system-sound-device-in-windows-7

Odpowiedź: /programming//a/4640225/704977

Szukasz interfejsu API EndpointVolume. Jest to część nowych interfejsów API audio, które zostały wydane w systemie Windows Vista, i można go użyć do uzyskania lub ustawienia głośności głównej.
... W CodeProject dostępna jest kompletna zarządzana biblioteka opakowań: Vista Core Audio API Master Volume Control.

music2myear
źródło
Dzięki za wskaźnik! Czy będę musiał to kodować sam, czy może znasz małe narzędzie, które wyszło z pytania / odpowiedzi? Nie dotknąłem wcześniej C #: jeśli muszę go sam kodować, czy jest dostępny kompilator?
peth
W najgorszym przypadku musisz pobrać program Visual Studio C # Express, który jest bezpłatny: microsoft.com/visualstudio/en-us/products/2010-editions/…
music2myear
Znalazłem tę konkretną odpowiedź tylko podczas szukania rozwiązania twojego pytania. Nie prowadziłem dalszych badań, aby sprawdzić, czy skompilowany plik binarny jest już publicznie dostępny.
music2myear
Wygląda na to, że to wyszukiwanie w Google ma pewne obietnice: google.com/search?q=get+current+volume+by+command+line+windows
music2myear
2
Ten wydaje się być zorientowany na C #. Jeśli szukasz opcji C ++ ', zobacz stackoverflow.com/a/21056089/32453
rogerdpack
4

Wiem, że powiedziałeś, że nie chcesz rozwiązania AutoHotkey, ale wierzę, że API AutoHotkey ma to, czego szukasz:

Nie musisz tworzyć GUI ani używać skrótów klawiszowych z AutoHotkey. Możesz pisać potężne narzędzia wiersza poleceń, kompilując .ahkskrypt. To powiedziawszy, będziesz chciał spojrzeć na komendę FileAppend do pracy stdout.

iglvzx
źródło
oto jeden, który to robi: gist.github.com/rdp/8363141 (chociaż prosta aplikacja na konsolę może być prostsza / łatwiejsza, zobacz inne komentarze tutaj)
rogerdpack
0

Wolumin główny jest przechowywany w lokalizacji rejestru:

...\#eSpeakerTopo\Properties\{7fb7b48f-531d-44a2-bcb3-5ad5a134b3dc}

Na przykład ten plik REG ustawia głośność główną na 100%.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{6994ad04-93ef-11d0-a3cc-00a0c9223196}\##?#HDAUDIO#FUNC_01&VEN_8384&DEV_7680&SUBSYS_83847680&REV_1034#4&31e60982&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}\#eSpeakerTopo\Properties\{7fb7b48f-531d-44a2-bcb3-5ad5a134b3dc}\20000]
@=hex(ffff1003):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00

Nazwa klucza może się różnić. Musisz ponownie uruchomić, aby zmiany odniosły skutek.

Edycja lub otwieranie klawisza Propertieslub może być niemożliwe . Chociaż masz niezbędne uprawnienia dostępu, może pojawić się taki błąd:{7fb7b48f-531d-44a2-bcb3-5ad5a134b3dc}regedit

[Window Title]
Error Opening Key

[Content]
{7fb7b48f-531d-44a2-bcb3-5ad5a134b3dc} cannot be opened.
An error is preventing this key from being opened.

[OK]

Jest tak, ponieważ nazwa klucza jest za długa. Będziesz musiał tymczasowo zmienić nazwę długiego klucza na jeden znak, a następnie zmienić jego nazwę z powrotem.

XP1
źródło