Java(+;-JNA)中是否有方法在XP+;Vista+;Windows7?

Java(+;-JNA)中是否有方法在XP+;Vista+;Windows7?,java,audio,Java,Audio,似乎java的声音API对于单流,甚至对于设置麦克风的输入,都能很好地工作,但对于设置Vista/Windows 7中的主音量级别,却不能很好地工作 参考文献: 仅适用于主卷的XP 任何人都有适合他们所有人的东西(没有兼容模式或控制鼠标以增加音量水平[类似机器人])。鉴于似乎没有本机解决方案,我目前的方法是使用jna发送“键盘音量上下”的键盘笔划: 您可能可以创建一个dll,然后将其挂接到“vista卷感知”的dll中,并可以使用jna对其进行正确的控制,并在此基础上调用方法 ffi/j

似乎java的声音API对于单流,甚至对于设置麦克风的输入,都能很好地工作,但对于设置Vista/Windows 7中的主音量级别,却不能很好地工作

参考文献:

仅适用于主卷的XP


任何人都有适合他们所有人的东西(没有兼容模式或控制鼠标以增加音量水平[类似机器人])。

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

您可能可以创建一个dll,然后将其挂接到“vista卷感知”的dll中,并可以使用jna对其进行正确的控制,并在此基础上调用方法

ffi/jna/jnr/jacob(访问IAudioEndpointVolume等)可能会起作用。(看来jna并不真正支持COM?)在这方面,ffi看起来也很可怕


可以使用java来做同样的事情。因此,下一个想法是尝试或者jacob已经完成了我的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;
}
#包括
#定义\u WIN32\u WINNT\u WIN32\u WINNT\u VISTA
#包括
#定义WIN32_精益_和_平均值
//Windows头文件:
#包括
#包括
#包括
#包括
int APIENTH_tWinMain(HINSTANCE HINSTANCE),
HINSTANCE HPPrevenstance,
LPTSTR lpCmdLine,
国际展览(nCmdShow)
{
双新卷=_ttof(lpCmdLine);
共初始化(空);
IMMDeviceEnumerator*deviceEnumerator=NULL;
如果(CoCreateInstance(uuuIdof(MMDeviceEnumerator)、NULL、CLSCTX_INPROC_U服务器、uuuIdof(IMMDeviceEnumerator)、(LPVOID*)和deviceEnumerator)==S_OK){
IMMDevice*defaultDevice=NULL;
如果(deviceEnumerator->GetDefaultAudioEndpoint(eRender、eConsole和defaultDevice)==S_OK){
IAudioEndpointVolume*endpointVolume=NULL;
如果(默认设备->激活(uuuuIdof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER,NULL,(LPVOID*)和endpointVolume)==S_OK){
endpointVolume->SetMasterVolumeLevel标量((浮点)newVolume,NULL);
endpointVolume->Release();
}
defaultDevice->Release();
}
deviceEnumerator->Release();
}
coninitialize();
返回0;
}

希望这能有所帮助。

另请查看是否正在寻找可以调用的对象。@rogerdpack这不是XP的noop吗?@SarahManning似乎是vista+是