hur.cn - 华软网

 热门搜索

Windows7下,用程序改变系统默认的播放设备?

  作者:未知    来源:网络    更新时间:2011/4/7
Windows7下,用程序改变系统默认的播放设备,找了很久,很难找到这方面的资料,MSDN上说引用程序不允许改变默认的播放或者录音设备,不知道大家有什么好的办法?谢谢!

---华软 网友回答---
每次提问都没人来,晕...
---华软网友回复---
vista和win7下是用MMDevice Api,DeviceTopology Api和WASAPI来管理声音的。
你可以在MSDN里查一下这三类api,我认为可能能解决问题的接口有以下几个
IMMDevice
IMMDeviceCollection
IMMDeviceEnumerator
IAudioSessionControl
IAudioSessionManager
IAudioAutoGainControl
IAudioChannelConfig
IDeviceTopology
---华软网友回复---
Enumerating Audio Devices
The first task of a client audio application is to find a suitable audio device to use. The MMDevice API lets clients discover the audio endpoint devices in the system and determine the suitability of the devices for use by the application. This API enables clients to retrieve collections of the available endpoint devices and get the capabilities of each device. Header file Mmdeviceapi.h defines the interfaces in the MMDevice API.

An audio adapter might contain several devices—for example, a wave-rendering device and a wave-capture device. These are adapter devices rather than endpoint devices. As mentioned previously, these devices are registered by the Plug and Play manager, in contrast with endpoint devices, which are registered by the endpoint manager. Each adapter device typically supports one or more endpoint devices. A rendering endpoint device (for example, headphones) can receive a stream of audio data from a client application, and a capture endpoint device (for example, a microphone) can send an audio stream to a client application.

Before enumerating the endpoint devices in the system, the client must first call the Windows CoCreateInstance function to create a device enumerator. A device enumerator is an object with an IMMDeviceEnumerator interface. For information about CoCreateInstance, see the Windows SDK documentation.

The client calls the IMMDeviceEnumerator::EnumAudioEndpoints method to create a collection of endpoint objects. Each endpoint object represents an audio endpoint device in the system. In this call, the client specifies whether the collection should contain all of the rendering devices in the system, all of the capture devices, or both.

A device collection is an object with an IMMDeviceCollection interface. Each item in a device collection is an endpoint object with at least the following two interfaces: 

An IMMDevice interface. A client obtains a reference to the IMMDevice interface of an endpoint object in a device collection by calling the IMMDeviceCollection::Item method. 
An IMMEndpoint interface. A client obtains a reference to the IMMEndpoint interface of an endpoint object by calling the IMMDevice::QueryInterface method. 
After retrieving a collection of endpoint devices, the client can query the properties of the individual devices in the collection to determine their suitability for use. For more information, see Device Properties.

After selecting a suitable device, the client can call the IMMDevice::Activate method to activate the device-specific interfaces in WASAPI, the DeviceTopology API, and the EndpointVolume API.

---华软网友回复---
引用 2 楼 jackson35296 的回复:
vista和win7下是用MMDevice Api,DeviceTopology Api和WASAPI来管理声音的。
你可以在MSDN里查一下这三类api,我认为可能能解决问题的接口有以下几个
IMMDevice
IMMDeviceCollection
IMMDeviceEnumerator
IAudioSessionControl
IAudioSessionManager
IAud……

一点建议:
用IMMDevice
IMMDeviceCollection
IMMDeviceEnumerator
这三个接口,可以枚举出播放下面的声卡设备(render),
找到你要设置的设备,你再看看有没有接口可以设置成默认的
---华软网友回复---
引用 4 楼 hideforever 的回复:
引用 2 楼 jackson35296 的回复:


这些接口我试过很多次,里面没有这样的函数,MSDN上面也描述这些接口实现不了这个功能,上面说应用程序不允许改变默认的播放或者录音设备.
---华软网友回复---
引用 5 楼 beyond0824 的回复:
这些接口我试过很多次,里面没有这样的函数,MSDN上面也描述这些接口实现不了这个功能,上面说应用程序不允许改变默认的播放或者录音设备.


设置默认的声卡设备应该是可以的(以前在XP遇到过,WIN7应该也可以)
再给个思路:
使用wave系列的接口:
1.用waveOutGetNumDevs()得到所有的设备数;
2.在设备数的循环里,用waveOutGetDevCaps得到每个设备的名字
如果是你想要设置的那个名字,记录下它的device id;
3.用waveOutMessage给这个device id发消息,将它设置成默认的(或者当前切换到它)
---华软网友回复---
发送这个消息应该可以,你试试DRVM_MAPPER_PREFERRED_SET
---华软网友回复---
引用 7 楼 hideforever 的回复:
发送这个消息应该可以,你试试DRVM_MAPPER_PREFERRED_SET

这个是Windows CE下的消息...
---华软网友回复---
还有大牛不?
---华软网友回复---
  class="deleted_message"> 该回复于2011-04-08 11:28:59被版主删除
---华软网友回复---
http://blog.csdn.net/xianxiejian/article/details/6669434
我这边的代码应该能解决你的问题      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。