Como posso acessar os níveis de volume na linha de comando do Windows 7?

17

O que eu preciso

Estou procurando uma ferramenta ou um script que permita acessar os níveis de volume do Windows na linha de comando. Idealmente, permitiria obter e definir todos os volumes, incluindo níveis de aplicativo, mas eu aceitaria apenas obter e apenas o nível mestre. Eu não me importo se ele usa PowerShell, WMI, JavaScript, .Net, voodoo, ou borboletas. Qualquer solução que me forneça apenas um número que eu possa processar para ajustar um intervalo de 0% a 100% serve.

Em outras palavras, as partes do prompt são a caixa preta que preciso preencher:

C:\> getvol master
50

ou mesmo

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

Não me importo se tiver que gastar algum tempo para embrulhá-lo ou mesmo escrever alguma coisa, se as ferramentas para fazê-lo estiverem disponíveis gratuitamente. No último caso, eu precisaria de alguns indicadores / prova de conceito para o núcleo, mas posso gerenciar o cruft sozinho. Também gostaria de evitar a instalação de novas estruturas de desenvolvimento apenas para esse fim (observe que as respostas do music2myear e do iglvzx foram fornecidas antes da introdução desses requisitos).

Como "plataformas", tenho disponível:

  • tudo o que acompanha o Windows 7 Home Premium
  • tudo o que acompanha o Cygwin
  • Perl
  • Pitão
  • Rubi

Geralmente, as soluções de código aberto são muito preferidas. As ferramentas de código fechado são válidas desde que sejam freeware e a fonte possa ser confiável. Soluções comerciais são proibidas.

Do que eu não preciso

  • Existem algumas perguntas semelhantes que tratam principalmente da definição do volume. Acima de tudo, preciso obter o volume, não definido.
  • Existe nircmdc, que suporta a configuração de volume, mas não a obtenção.
  • Existe uma chave [1] no meu registro que possui valores que mudam previsivelmente quando ajusto o volume através do misturador da GUI, mas acho que a leitura dessa chave é propensa a falhas nas alterações de hardware ou nas atualizações do sistema. A menos que eu possa confiar que a solução é razoavelmente à prova de futuro, não posso usá-la.
  • Existem AutoHotKeye WSHsoluções para configurar o volume na Web, mas a) elas também são boas apenas para configurar e, pior ainda, b) usam SendKeysou automatizam o movimento do mouse para controlar a GUI. Automatizar a GUI não é uma opção.

O ##windowscanal no freenode é inútil como sempre, o Google transborda de hacks e soluções alternativas incompletas, e não consigo distinguir uma chamada WinAPI de um encantamento Wiccan.

Alguém sabe de uma maneira?


  1. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E96C-E325-11CE-BFC1-08002BE10318}\0000\MixerSettings\eLineOutTopo\PrimaryNode000
peth
fonte
Semms como WMI não é uma opção :(
Der Hochstapler
Possivelmente relevante: superuser.com/questions/284527/…
Der Hochstapler
Você precisa que eu expanda minha resposta? Eu não tinha certeza de que você precisava de mais, pois parece ter experiência com programação. Eu posso fornecer um exemplo de como você pode usar o AutoHotkey para atingir facilmente seu objetivo.
iglvzx
Eu acho que é uma sugestão muito boa, obrigado novamente, mas AHK me mordeu uma vez e sou tímida desde então. Eu provavelmente não o usaria, mesmo que fosse uma solução completa. Nada impedindo que você o expanda para futuros leitores / mais votos positivos. :)
peth
11
(como uma observação de que o registro nem parece existir na minha caixa, então ... pode ser realmente instável). Veja também minha resposta em c ++ aqui: stackoverflow.com/a/21056089/32453
rogerdpack

Respostas:

5

Esta pergunta foi feita e respondida no StackOverflow: /programming/4640106/how-to-get-current-volume-of-system-sound-device-in-windows-7

A resposta: /programming//a/4640225/704977

Você está procurando a API EndpointVolume. Isso faz parte das novas APIs de áudio lançadas no Windows Vista e pode ser usado para obter ou definir o volume principal.
... Existe uma biblioteca completa de wrapper gerenciado disponível no CodeProject: Controle de volume principal da API de áudio do Core Core do Vista.

music2myear
fonte
Obrigado pelo ponteiro! Terei que codificar isso sozinho ou você conhece alguma pequena ferramenta que surgiu da pergunta / resposta? Eu nunca toquei em C # antes: se eu tiver que codificá-lo, existe um compilador disponível gratuitamente?
peth
Na pior das hipóteses, você precisará baixar o Visual Studio C # Express, que é gratuito: microsoft.com/visualstudio/en-us/products/2010-editions/…
music2myear
Encontrei apenas essa resposta em particular enquanto procurava uma solução para sua pergunta. Não busquei mais pesquisas para verificar se já existe um binário compilado publicamente.
Music2myear 28/02/12
Esta pesquisa no Google parece ter alguma promessa: google.com/search?q=get+current+volume+by+command+line+windows
music2myear
2
Esse parece ser orientado para C #. Se você está procurando uma opção ish em C ++, consulte stackoverflow.com/a/21056089/32453
rogerdpack
4

Sei que você disse que não queria uma solução AutoHotkey, mas acredito que a API AutoHotkey tem o que você está procurando:

Você não precisa criar GUIs ou usar teclas de atalho com a AutoHotkey. Você pode escrever poderosos utilitários de linha de comando compilando um .ahkscript. Dito isto, você desejará examinar o comando FileAppend para trabalhar stdout.

iglvzx
fonte
aqui está um que faz isso: gist.github.com/rdp/8363141 (embora um console app direto para ele pode ser mais simples / mais fácil, Veja outros comentários aqui)
rogerdpack
0

O volume principal é armazenado no local do registro:

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

Por exemplo, este arquivo REG define o volume principal para 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

O nome da chave pode ser diferente. Você precisa reiniciar para que as alterações tenham efeito.

Talvez você não consiga editar ou abrir a tecla Propertiesou . Embora você tenha as permissões de acesso necessárias, você pode receber um erro como este:{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]

Isso ocorre porque o nome da chave é muito longo. Você precisará renomear temporariamente o nome da chave longa para um caractere e, em seguida, renomeá-lo novamente.

XP1
fonte