win7 系统下实现音量控制
番茄系统家园 · 2021-08-23 04:10:17

win7对做了改进除了有总音量控制,每个程序又有自己的音量控制。通常XP下控制音量的函数只能控制自己的音量而无法控制主音量。比如函数、等.所以使用这些函数无法实现音量控制的功能,改进的做法是使用
在win7下使用COM获得从而实现音量控制
;(NULL);//保留参数必须为;hrCoCreateGuid(g_guidMyContext);//生成一个GUID码用来识别CLSIDsandinterfaceIMMDeviceEnumerator*deviceEnumeratorNULL;hrCoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_INPROC_SERVER,__uuidof(IMMDeviceEnumerator),(LPVOID*)deviceEnumerator);IMMDevice*defaultDeviceNULL;hrdeviceEnumerator-GetDefaultAudioEndpoint(eRender,eConsole,defaultDevice);deviceEnumerator-Release();deviceEnumeratorNULL;IAudioEndpointVolume*endpointVolumeNULL;hrdefaultDevice-Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER,NULL,(LPVOID*)endpointVolume);defaultDevice-Release();defaultDeviceNULL;UINTuStep0;UINTuStepCount0;endpointVolume-GetVolumeStepInfo(uStep,uStepCount);//steprangefrom0to*pStepCount–1endpointVolume-SetMasterVolumeLevel(fVolume,g_guidMyContext);//indecibelendpointVolume-SetMasterVolumeLevelScalar(fVolume,g_guidMyContext);endpointVolume-SetMute(0,g_guidMyContext);//mute
下面分别解释每一步的意义:
HRESULThrS_OK;hrCoInitialize(NULL);//保留参数必须为NULL
应用程序调用com库函数除CoGetMalloc和内存分配函数之前必须初始化com库。
CoInitialize是Windows提供的API函数用来告诉Windows以单线程的方式创建com对象。CoInitializeEX是多线程方式使用CoInitialize创建可以使对象直接与线程连接得到最高的性能。CoInitialize并不装载COM库它只用来初始化当前线程使用什么样的套间。使用这个函数后线程就和一个套间建立了对应关系。线程的套间模式决定了该线程如何调用COM对象是否需要列集等。 CoInitialize()并不会干扰客户和服务器之间的通信它所做的事情是让线程注册一个套间而线程运行过程中必然在此套间。 CoInitialize和CoUninitialize必须成对使用在每个线程函数里。
GUIDg_guidMyContextGUID_NULL;hrCoCreateGuid(g_guidMyContext);//生成一个GUID码用来识别CLSIDsandinterface
COM中所有的类、接口、类型库都用GUID来唯一标识. GUID是一个128位的字串.COM组件的创建查询接口都是通过注册表进行的。有了注册表应用程序就不需要知道组件的DLL文件名、位置只需要根据CLSID查就可以了。
IMMDeviceEnumerator*deviceEnumeratorNULL;hrCoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_INPROC_SERVER,__uuidof(IMMDeviceEnumerator),(LPVOID*)deviceEnumerator);
CoCreateInstance(....)//函数内部实现
{
.......
IClassFactory*pClassFactoryNULL;
免责声明: 凡标注转载/编译字样内容并非本站原创,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如果你觉得本文好,欢迎推荐给朋友阅读;本文链接: https://m.nndssk.com/post/44470.html。
