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 中可靠地设置主系统音量?的主要内容,如果未能解决你的问题,请参考以下文章
JNA/ByteBuffer 没有被释放并导致 C 堆内存不足
全网首发:编译jna:dispatch.h:30:34: fatal error: com_sun_jna_Function.h: 没有那个文件或目录