繁体   English   中英

Java(+-JNA)中有没有一种方法可以在XP + Vista + Windows 7中可靠地设置主系统卷?

[英]Is there a way in Java (+- JNA) to set the master system volume reliably in XP+Vista+Windows 7?

看来Java的声音API可以很好地用于单个流,甚至可以用于设置来自麦克风的输入,但是不能用于设置Vista / Windows 7中的主音量级别。

参考:

Java Sound API可访问Vista和Win 7中的系统/主音量控制

如何通过Java程序调整扬声器音量?

更改主音量级别仅适用于XP中的主音量

任何人都可以使用适用于所有人的东西(没有兼容模式或控制鼠标以提高音量级别[类似机器人])。

已经完成了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;
}

希望这可以帮助。

鉴于似乎没有本机解决方案,我当前的方法是使用jna发送“键盘上下音量”的键盘笔触:

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

您可能能够创建一个dll,然后将其挂接到“具有vista卷感知功能”的dll中,并且实际上可以对其进行正确控制,并使用jna对其调用方法。

ffi / jna / jnr / jacob(访问IAudioEndpointVolume等)可能有效。 (看来jna确实不支持COM?)就这一点而言,ffi看起来也很恐怖。

可能会使用Java COM桥来执行相同的操作。 所以下一个想法是尝试bridj或jacob

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM