Есть ли способ в Java (+ - JNA) надежно установить громкость основной системы в XP + Vista + Windows 7? - PullRequest
0 голосов
/ 14 июля 2010

Похоже, что звуковой API java хорошо работает для отдельных потоков и даже для настройки входа с микрофона, но не для настройки уровня громкости в Vista / Windows 7.

refs:

Java Sound API для доступа к системному / основному контролю громкости в Vista и Win 7

Как отрегулировать громкость динамика из программы Java?

Изменение уровня общей громкости работает только на XP для основной громкости

У кого-нибудь есть что-то, что будет работать для всех них (без режима совместимости или управления мышью для увеличения уровня громкости [робот-как]).

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Сделал мою долю JNI и держись подальше, где я могу. До тех пор, пока вам нужно работать в естественном режиме, чтобы выполнить что-то, и предполагая, что задача проста и производительность не является серьезной проблемой, я обнаружил, что намного проще запустить отдельный процесс, чем иметь дело с JNI или любым из его кузенов. Вот некоторый код 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 голосов
/ 16 июля 2010

видя, что нет никакого собственного решения, мой текущий метод состоит в том, чтобы использовать jna для отправки нажатий клавиш для «увеличения и уменьшения громкости клавиатуры»:

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

Вы можетебыть в состоянии создать dll, а затем подключиться к нему, который «осведомлен о громкости перспективы» и может реально управлять им, и вызывать методы для этого, используя jna.

ffi / jna / jnr / jacob (для доступа к IAudioEndpointVolumeи т.д.) может сработать.(кажется, что jna на самом деле не поддерживает COM?) В этом отношении ffi тоже выглядит пугающе.

Возможно, для этого используется java COM-мост .Поэтому следующая мысль - попробовать либо bridj , либо jacob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...