Java (+- JNA) 中有没有办法在 XP+Vista+Windows 7 中可靠地设置主系统音量?

Posted

技术标签:

【中文标题】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? 【发布时间】:2010-07-14 19:07:02 【问题描述】:

似乎 java 的声音 API 可以很好地用于单个流,甚至可以用于设置来自麦克风的输入,但不适用于在 Vista/Windows 7 中设置主音量。

参考:

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 的主卷

任何人都有适合所有人的东西(无需兼容模式或控制鼠标以提高音量 [类似于机器人])。

【问题讨论】:

另见***.com/questions/4964947/set-computer-volume 【参考方案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;

希望这会有所帮助。

【讨论】:

如果您正在寻找可以呼唤的东西,另请参阅***.com/a/21056089/32453。 @rogerdpack 这不是 XP 的问题吗? @SarahManning 似乎是 vista+ 是的【参考方案2】:

鉴于似乎没有原生解决方案,我目前的方法是使用 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

【讨论】:

以上是关于Java (+- JNA) 中有没有办法在 XP+Vista+Windows 7 中可靠地设置主系统音量?的主要内容,如果未能解决你的问题,请参考以下文章

无法初始化类 com.sun.jna.Native

调用使用 Java + JNA 的 WinInet 函数

JNA/ByteBuffer 没有被释放并导致 C 堆内存不足

全网首发:编译jna:dispatch.h:30:34: fatal error: com_sun_jna_Function.h: 没有那个文件或目录

Java-JNA使用心得2

java高级用法之:JNA中的Memory和Pointer