2010-07-14 62 views
0

看來,Java的聲音API的工作以及對單流,甚至從麥克風設置輸入,而不是7Java(+ - JNA)在XP + Vista + Windows 7中可以可靠地設置主系統卷嗎?

裁判設置在Vista/Windows中的主音量:

Java Sound API to access the system/master volume control in Vista and Win 7

How to adjust speaker volume from Java program?

Changing master volume level 僅適用於XP的主音量

任何人都可以使用所有這些功能(沒有兼容模式或控制鼠標以增加音量級別[類似於機器人])。

+0

參見http://stackoverflow.com/questions/4964947/set-computer-volume – rogerdpack 2013-09-04 18:35:59

回答

0

看到,因爲那裏看來是沒有本土的解決方案,我目前的方法是使用JNA爲發送鍵盤敲擊「鍵盤音量上下」:

https://superuser.com/questions/82229/how-to-control-master-volume-in-windows-7/86227#86227

你也許可以創造一個然後dll掛鉤,它是「vista音量感知」,並可以實際控制它,並調用方法,使用jna。

ffi/jna/jnr/jacob(用於訪問IAudioEndpointVolume等)可能工作。 (出現jna並不真的支持COM?)在這方面,ffi看起來也很可怕。

可能可以使用java COM bridge來做同樣的事情。所以接下來的想法是嘗試bridj或jacob

1

已經完成了我的JNI份額,並在我可以的地方引導。只要你必須本土去完成某件事情,並且假設任務簡單並且性能不是主要問題,那麼我發現啓動一個單獨的進程要比處理JNI或它的任何表兄弟容易得多。下面是適於從this文章,將設置基於單個命令行參數的主音量一些C++代碼:

#include <WinSDKVer.h> 
#define _WIN32_WINNT _WIN32_WINNT_VISTA 
#include <SDKDDKVer.h> 

#define WIN32_LEAN_AND_MEAN 
// Windows Header Files: 
#include <windows.h> 
#include <tchar.h> 

#include <mmdeviceapi.h> 
#include <endpointvolume.h> 

int APIENTRY _tWinMain(HINSTANCE hInstance, 
       HINSTANCE hPrevInstance, 
       LPTSTR lpCmdLine, 
       int  nCmdShow) 
{ 
double newVolume = _ttof(lpCmdLine); 

CoInitialize(NULL); 

IMMDeviceEnumerator* deviceEnumerator = NULL; 
if(CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator) == S_OK) { 
    IMMDevice* defaultDevice = NULL; 
    if(deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice) == S_OK) { 
     IAudioEndpointVolume* endpointVolume = NULL; 
     if(defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume) == S_OK) { 
      endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL); 
      endpointVolume->Release(); 
     } 
     defaultDevice->Release(); 
    } 
    deviceEnumerator->Release(); 
} 

CoUninitialize(); 

return 0; 
} 

希望這有助於。

+0

也http://stackoverflow.com/a/21056089/32453看看是否找東西招呼一下。 – rogerdpack 2014-01-29 20:30:24

+0

@rogerdpack不是這是XP的一個noop? – 2016-01-24 21:25:52

+0

@SarahManning似乎是vista +是的 – rogerdpack 2016-01-25 00:54:07

相關問題