200分:WIN7下如何用代码控制音量合成器中某一程序的音量?

hpygzhx520 2011-07-01 01:47:30
如题,WIN7下如何用代码控制音量合成器中某一程序的音量?比如自己写一程序,名称为AAA,当AAA有声音播放的时候,WIN7合成器里面就看以看到这个AAA,可以调整音量或静音。但用代码怎么做呢?

集思广益。
...全文
1373 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lomsunday 2012-09-03
  • 打赏
  • 举报
回复
今天碰到同样的问题,查看了一下音量合成器(SNDVOL.exe)的导入的DLL。未果,希望有高手解答,顶一下。
看到有人用的mixer,不知道行不行,还封装成了一个类
fhtthg3 2012-01-14
  • 打赏
  • 举报
回复
是的.这个问题我也遇到了.无论是autoit3 和 python

都是通过调用wimm.dll都是只能控制本程序的音量.无法控制整个系统(win7)的音量.

目前这个问题我也还在寻求解决方法中.

同问~~~~~~~
LOOKING_SNOW 2011-12-03
  • 打赏
  • 举报
回复
楼主,虽然你已经结帖,我还是写上几句话吧。这几天你说的这问题也困扰到了我。

我本来是写一个FLASH播放器的东西,就是用VB编程,添加FLASH组件,然后播放我的FLASH文件。

原来在XP下是做好了的,现在在WIN7中,出现系统音量控制的问题。WIN7的音量控制不同了,可以细化到每一个程序。

原来在XP下,我用的是“winmm”的waveoutgetvolume,以及waveoutsetvolume来取得和设置音量。通过一个tracebar来控制音量大小。

但在WIN7下不行了。

我找了一下,原因在于WIN7中控制的是本程序的音量。但驱动音量合成器中程序音量的是FLASH组件,也就是说,在我的程序运行之初,没有开始播放任何FLASH之前,音量合成器中不会出现程序音量的选单。那么waveoutgetvolume取不到音量大小。但是,一旦开始播放了,waveoutsetvolume还是可以成功控制本程序音量大小的。

我是一个编程的业余爱好者,不知以上几句话说清楚没有。

希望能给遇到同样问题的人提供一点点帮助。

如果您有什么解决办法,请贴出来吧
倒大霉的上帝 2011-07-20
  • 打赏
  • 举报
回复
win7是神马?
文盲友情路过帮顶。
smartdj1 2011-07-19
  • 打赏
  • 举报
回复
to hpygzhx520 你的抢焦点问题解决了吗?mail me smart.dj@163.com
smartdj1 2011-07-19
  • 打赏
  • 举报
回复
HRESULT hr = E_FAIL;
IMMDeviceEnumerator* device_enumerator;
IMMDevice* defaultdevice;
IAudioSessionManager2* audio_session_mamanger2;
IAudioSessionEnumerator* audio_session_enumerator;
ISimpleAudioVolume* simple_audio_volume;

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,
CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&device_enumerator);
if (FAILED(hr))
return hr;

if(SUCCEEDED(device_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultdevice)))
{
if(SUCCEEDED(defaultdevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&audio_session_mamanger2)))
{
if(SUCCEEDED(audio_session_mamanger2->GetSessionEnumerator(&audio_session_enumerator)))
{
int count;
if(SUCCEEDED(audio_session_enumerator->GetCount(&count)))
{
for (int i = 0; i < count; i++)
{
IAudioSessionControl* audio_session_control;
IAudioSessionControl2* audio_session_control2;
if(SUCCEEDED(audio_session_enumerator->GetSession(i, &audio_session_control)))
{
if(SUCCEEDED(audio_session_control->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&audio_session_control2)))
{
DWORD processid;
if(SUCCEEDED(audio_session_control2->GetProcessId(&processid)))
{
if (processid == GetCurrentProcessId())
{
if(SUCCEEDED(audio_session_control2->QueryInterface(__uuidof(ISimpleAudioVolume), (void**) &simple_audio_volume)))
{
if(SUCCEEDED(simple_audio_volume->SetMute(IsMuted, NULL)))
simple_audio_volume->Release();
}
}
audio_session_control->Release();
audio_session_control2->Release();
}
}
}
}
audio_session_mamanger2->Release();
audio_session_enumerator->Release();
defaultdevice->Release();
}
}
}
}
hpygzhx520 2011-07-19
  • 打赏
  • 举报
回复
IProtectFocus接口可以控制焦点
hpygzhx520 2011-07-18
  • 打赏
  • 举报
回复
怎么成了大家比谁更白的主题了,呵呵
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sysdzw 的回复:]
小白关注中
[/Quote]
没偶白
hpygzhx520 2011-07-08
  • 打赏
  • 举报
回复
自己顶起
Tiger_Zhao 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hpygzhx520 的回复:]Audio Sessions这个概念应该是更“底层”的,因为有程序在XP下也能实现类似WIN7的音量合成器的功能。[/Quote]
Direct Sound 有自己的混音处理,所以在 XP 下也可以对不同的程序分别进行音量控制,但这只限于用了 DirectX 的程序。
而 Vista/Win7 的 WASAPI 属于系统层的封装,对所有程序的音频输出都会经过这里。
hpygzhx520 2011-07-05
  • 打赏
  • 举报
回复
比如http://www.onlinedown.net/soft/56220.htm
这个IndieVolume软件似乎就可以做到的……,当然这是题外话了
huxingwu 2011-07-05
  • 打赏
  • 举报
回复
模拟鼠标键盘点不行吗,找句柄,后台sendmessage模拟点击。就像外挂一样
无·法 2011-07-05
  • 打赏
  • 举报
回复
小白关注中
hpygzhx520 2011-07-04
  • 打赏
  • 举报
回复
WIN7下的东西,XP没有的
咸清 2011-07-04
  • 打赏
  • 举报
回复
音量合成器?
神马?
能控制吗?
贝隆 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hpygzhx520 的回复:]
我的终极目标是控制自身程序的音量,
ISimpleAudioVolume应该是可以的,这个接口似乎是包含在MF.DLL中,应该是可以实现的。当然这只适用于高于XP的系统。


Audio Sessions这个概念应该是更“底层”的,因为有程序在XP下也能实现类似WIN7的音量合成器的功能。

但无论哪个思路,看似都无比的复杂。


回Veron_04:这方面倒还没接触过。你的意思……
[/Quote]
是的
hpygzhx520 2011-07-04
  • 打赏
  • 举报
回复
继续顶!毫无头绪
hpygzhx520 2011-07-04
  • 打赏
  • 举报
回复
我的终极目标是控制自身程序的音量,
ISimpleAudioVolume应该是可以的,这个接口似乎是包含在MF.DLL中,应该是可以实现的。当然这只适用于高于XP的系统。


Audio Sessions这个概念应该是更“底层”的,因为有程序在XP下也能实现类似WIN7的音量合成器的功能。

但无论哪个思路,看似都无比的复杂。


回Veron_04:这方面倒还没接触过。你的意思是用视频采集卡的开发包来完成这个功能?
贝隆 2011-07-04
  • 打赏
  • 举报
回复
我有一个思路,属于胡思乱想哈
不是有一个视频采集卡吗?比如SDK3000 他的开发包下有这么两个函数:

函数功能: 采集指定系统中声卡设备名的音频
Function SetCurrentAudioCompressorName(strAudDevName As String) As Boolean
函数参数:strAudDevName: 声卡设备名,strAudDevName 为""表示取消音频采集


函数功能: 采集指定系统中声卡设备序号的音频
Function SetCurrentAudioCompressorNum(nAudDevIndex As Long) As Boolean
函数参数:
nAudDevIndex: 声卡设备下标,nCurrentAudDevice 为-1,表示取消音频采集

如果有硬件,我敢肯定有用的。说不得安装了开发包,没有视频采集卡也有用。


加载更多回复(6)

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧