//gcc -Wall -O3 -Os -s 音量闪换.c -I. -L. -lwinmm -lmingw32 -lgdi32 -lole32 -loleaut32 -luuid -lmsimg32 -lShlwapi -lKernel32 -lcomdlg32 -luser32 -lws2_32 -lcomctl32 -limm32 -o "音量闪换"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ob**ase.h>
/** Utlizar Mingw-w64 para obtener referencia a cada interfaz **/
#include <mmdeviceapi.h>
#include <endpointvolume.h>
typedef HRESULT(CALLBACK* CoInit)(void*);
typedef void(CALLBACK* CoUnit)(void);
typedef HRESULT(CALLBACK* CoCrIn)(CLSID*, LPUNKNOWN, DWORD, IID*, void**);
/** Declaramos las GUID's de cada interfaz a utlizar **/
const CLSID CLSID_MMDeviceEnumerator = {0xBCDE0395, 0xE52F, 0x467C, {0x8E,0x3D, 0xC4,0x57,0x92,0x91,0x69,0x2E}};
const IID IID_IMMDeviceEnumerator = {0xA95664D2, 0x9614, 0x4F35, {0xA7,0x46, 0xDE,0x8D,0xB6,0x36,0x17,0xE6}};
const IID IID_IAudioEndpointVolume = {0x5CDF2C82, 0x841E, 0x4546, {0x97,0x22, 0x0C,0xF7,0x40,0x78,0x22,0x9A}};
int function_volume(IAudioEndpointVolume* control);
void bucle_function_volume(IAudioEndpointVolume* control);
int main(int argc,char **argv)
{
HANDLE getDll = LoadLibrary("Ole32");
CoInit coInit = (CoInit)GetProcAddress(getDll, "CoInitialize");
CoUnit coUnit = (CoUnit)GetProcAddress(getDll, "CoUninitialize");
CoCrIn coCreateIns = (CoCrIn)GetProcAddress(getDll, "CoCreateInstance");
HRESULT resp;
IMMDeviceEnumerator* i_deviceEnum = NULL;
IMMDevice* i_device = NULL;
IAudioEndpointVolume* i_audioend = NULL;
/** Iniciar libreria COM **/
if((resp = coInit(NULL)) == S_OK)
{
/** Obtener la interfaz MMDeviceEnumerator **/
if((resp = coCreateIns((GUID *)&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, (GUID *)&IID_IMMDeviceEnumerator, (void**)&i_deviceEnum)) == S_OK)
{
/** Mediante interfaz MMDeviceEnumerator llamamos al metodo GetDefaultAudioEndpoint para obtener la interfaz MMDevice **/
if((resp = i_deviceEnum->lpVtbl->GetDefaultAudioEndpoint(i_deviceEnum, 0, 0, &i_device)) == S_OK)
{
/** Mediante interfaz MMDevice llamamos al metodo Activate para obtener la interfaz IAudioEndpointVolume **/
if((resp = i_device->lpVtbl->Activate(i_device, &IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&i_audioend)) == S_OK)
{
if(function_volume(i_audioend) == 1)
{
printf("Error en opciones de volumen");
return 1;
}
}
else
{
printf("Error al obtener interfaz IAudioEndpointVolume");
return 1;
}
}
else
{
printf("Error al obtener interfaz IMMdevice");
return 1;
}
}
else
{
printf("Error al obtener interfaz IMMDeviceEnumerator");
return 1;
}
}
else
{
printf("Error al iniciar libreria COM");
return 1;
}
/** Liberar recursos **/
coUnit();
FreeLibrary(getDll);
return 0;
}
/** Opciones para el control de volumen **/
int function_volume(IAudioEndpointVolume* control)
{
int resp;
HRESULT ok;
float volumen,volumen1,volumen2;
resp = 1;
volumen1=atoi(__argv[1]);
volumen2=atoi(__argv[2]);
if(__argc==1){
puts("音量快速切换工具 ver beta1.0");
puts("命令格式(音量取值范围0~100):");
puts("命令名 参数1");
puts("命令名 参数1 参数2(在参数1~2之间切换)");
}
//指定单个音量
if(__argc==2&&volumen1 >= 0 && volumen1 <= 100 && (ok = control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen1*0.01, NULL)) == S_OK)
{
printf("当前音量值: %.f \n", volumen1);
resp = 0;
}
//两个值切换
if(__argc==3&&volumen1 >= 0 && volumen1 <= 100){
control->lpVtbl->GetMasterVolumeLevelScalar(control, &volumen);
//printf("获取未修改前系统音量值%f",volumen*100);
if(volumen*100 <= volumen1){control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen2*0.01, NULL);}
if(volumen*100 > volumen1){control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen1*0.01, NULL);}
}
resp = 0;
return resp;
}
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ob**ase.h>
/** Utlizar Mingw-w64 para obtener referencia a cada interfaz **/
#include <mmdeviceapi.h>
#include <endpointvolume.h>
typedef HRESULT(CALLBACK* CoInit)(void*);
typedef void(CALLBACK* CoUnit)(void);
typedef HRESULT(CALLBACK* CoCrIn)(CLSID*, LPUNKNOWN, DWORD, IID*, void**);
/** Declaramos las GUID's de cada interfaz a utlizar **/
const CLSID CLSID_MMDeviceEnumerator = {0xBCDE0395, 0xE52F, 0x467C, {0x8E,0x3D, 0xC4,0x57,0x92,0x91,0x69,0x2E}};
const IID IID_IMMDeviceEnumerator = {0xA95664D2, 0x9614, 0x4F35, {0xA7,0x46, 0xDE,0x8D,0xB6,0x36,0x17,0xE6}};
const IID IID_IAudioEndpointVolume = {0x5CDF2C82, 0x841E, 0x4546, {0x97,0x22, 0x0C,0xF7,0x40,0x78,0x22,0x9A}};
int function_volume(IAudioEndpointVolume* control);
void bucle_function_volume(IAudioEndpointVolume* control);
int main(int argc,char **argv)
{
HANDLE getDll = LoadLibrary("Ole32");
CoInit coInit = (CoInit)GetProcAddress(getDll, "CoInitialize");
CoUnit coUnit = (CoUnit)GetProcAddress(getDll, "CoUninitialize");
CoCrIn coCreateIns = (CoCrIn)GetProcAddress(getDll, "CoCreateInstance");
HRESULT resp;
IMMDeviceEnumerator* i_deviceEnum = NULL;
IMMDevice* i_device = NULL;
IAudioEndpointVolume* i_audioend = NULL;
/** Iniciar libreria COM **/
if((resp = coInit(NULL)) == S_OK)
{
/** Obtener la interfaz MMDeviceEnumerator **/
if((resp = coCreateIns((GUID *)&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, (GUID *)&IID_IMMDeviceEnumerator, (void**)&i_deviceEnum)) == S_OK)
{
/** Mediante interfaz MMDeviceEnumerator llamamos al metodo GetDefaultAudioEndpoint para obtener la interfaz MMDevice **/
if((resp = i_deviceEnum->lpVtbl->GetDefaultAudioEndpoint(i_deviceEnum, 0, 0, &i_device)) == S_OK)
{
/** Mediante interfaz MMDevice llamamos al metodo Activate para obtener la interfaz IAudioEndpointVolume **/
if((resp = i_device->lpVtbl->Activate(i_device, &IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&i_audioend)) == S_OK)
{
if(function_volume(i_audioend) == 1)
{
printf("Error en opciones de volumen");
return 1;
}
}
else
{
printf("Error al obtener interfaz IAudioEndpointVolume");
return 1;
}
}
else
{
printf("Error al obtener interfaz IMMdevice");
return 1;
}
}
else
{
printf("Error al obtener interfaz IMMDeviceEnumerator");
return 1;
}
}
else
{
printf("Error al iniciar libreria COM");
return 1;
}
/** Liberar recursos **/
coUnit();
FreeLibrary(getDll);
return 0;
}
/** Opciones para el control de volumen **/
int function_volume(IAudioEndpointVolume* control)
{
int resp;
HRESULT ok;
float volumen,volumen1,volumen2;
resp = 1;
volumen1=atoi(__argv[1]);
volumen2=atoi(__argv[2]);
if(__argc==1){
puts("音量快速切换工具 ver beta1.0");
puts("命令格式(音量取值范围0~100):");
puts("命令名 参数1");
puts("命令名 参数1 参数2(在参数1~2之间切换)");
}
//指定单个音量
if(__argc==2&&volumen1 >= 0 && volumen1 <= 100 && (ok = control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen1*0.01, NULL)) == S_OK)
{
printf("当前音量值: %.f \n", volumen1);
resp = 0;
}
//两个值切换
if(__argc==3&&volumen1 >= 0 && volumen1 <= 100){
control->lpVtbl->GetMasterVolumeLevelScalar(control, &volumen);
//printf("获取未修改前系统音量值%f",volumen*100);
if(volumen*100 <= volumen1){control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen2*0.01, NULL);}
if(volumen*100 > volumen1){control->lpVtbl->SetMasterVolumeLevelScalar(control, volumen1*0.01, NULL);}
}
resp = 0;
return resp;
}