分享
 
 
 

一个控制声音的程序(代码如下:)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

#include <windows.h>

#include <stdio.h>

#include "release\resource.h"

#define WM_SETSOUND WM_USER+1

#define WM_MY_TRAY_NOTIFICATION WM_USER+2

#define WM_CHOOSEWAY WM_USER+3

#pragma comment(lib,"winmm.lib")

//回调函数声明

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//全局函数声明

//BOOL TrayMessage(HWND,DWORD,HICON,PSTR);

BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, PSTR pszTip)

{

BOOL res;

NOTIFYICONDATA tnd;

tnd.cbSize = sizeof(NOTIFYICONDATA);

tnd.hWnd = hWnd;

tnd.uID = ID_TRAYICON;

tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;

tnd.uCallbackMessage= WM_MY_TRAY_NOTIFICATION;

tnd.hIcon = hIcon;

lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip));

res = Shell_NotifyIcon(dwMessage, &tnd);

return res;

}

//主函数

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpcmdLine,int nCmdShow)

{

static TCHAR szAppName[]=TEXT("volume ctrl");

static TCHAR szClassName[]=TEXT("volume ctrl");

HWND hwnd;

MSG msg;

WNDCLASS wndclass;

wndclass.style=CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hInstance=hInstance;

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName=szClassName;

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,"Register WNDCLASS FAILTURE!",szAppName,MB_ICONERROR);

return FALSE;

}

hwnd=CreateWindow(szClassName,"VOLUME CTRL",

WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

//下两句取消可使窗口最开始时就不可见

//ShowWindow(hwnd,nCmdShow);

//UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

//回调函数

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

//变量声明

static HINSTANCE hInstance;

static HMIXER hMixer; //混频器句柄

static HMIXER hMixerWave; //WAVEOUT句柄

static DWORD m_controlnum; //用于保存声道数

static DWORD m_controlid; //声道的ID

static LONG m_min; //声音最小值

static LONG m_max; //声音最大值

static LONG vr,vl; //左右声道

static HICON hIcon;

static HKEY hKey;

static bChMenu=FALSE,bWave=FALSE,bNoVoilce=FALSE;

static iChCtrl=0;

LPTSTR lpBuffer=NULL;

DWORD dwRegAttr;

char test[20];

switch(message)

{

case WM_CREATE:

hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);

//注册热键

RegisterHotKey(hwnd,0xC010,MOD_SHIFT,VK_ADD);

RegisterHotKey(hwnd,0xC011,MOD_SHIFT,VK_SUBTRACT);

RegisterHotKey(hwnd,0xC012,MOD_CONTROL,VK_ADD);

RegisterHotKey(hwnd,0xC013,MOD_CONTROL,VK_SUBTRACT);

RegisterHotKey(hwnd,0xC014,MOD_CONTROL,VK_MULTIPLY);

//托盘图标产生

hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(ID_TRAYICON));

if(!TrayMessage(hwnd,NIM_ADD,hIcon, "声音控制"))

{

return FALSE;

}

//初始化声音控制

MIXERCAPS mxcaps; //混频器容量

ZeroMemory(&mxcaps, sizeof(MIXERCAPS));

if (mixerGetNumDevs() != 0)

{

if (mixerOpen(&hMixer,0,(DWORD)hwnd,NULL,MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)!= MMSYSERR_NOERROR)

return FALSE;

//The mixerGetDevCaps function queries a specified mixer device to determine its capabilities

if (mixerGetDevCaps((UINT)hMixer, &mxcaps, sizeof(MIXERCAPS))!= MMSYSERR_NOERROR)

return FALSE;

}

if (hMixer == NULL)

return FALSE;

SendMessage(hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0);

ShowWindow(hwnd,SW_HIDE);

break;

case WM_CHOOSEWAY: //选择控制方式

MIXERLINE mxl; //混频器线路数

mxl.cbStruct = sizeof(MIXERLINE);//必须初始化

mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;

if (mixerGetLineInfo((HMIXEROBJ)hMixer,

&mxl,MIXER_OBJECTF_HMIXER |

MIXER_GETLINEINFOF_COMPONENTTYPE)!= MMSYSERR_NOERROR)

return FALSE;

//MessageBox(hwnd,"OK","",MB_OK);

if(bWave)

{

//MessageBox(hwnd,"OK","",MB_OK);

DWORD num=mxl.cConnections;

DWORD type=mxl.dwDestination;

for( DWORD i=0;i<num;i++)

{

mxl.cbStruct = sizeof(MIXERLINE);

mxl.dwDestination = type;

mxl.dwSource = i;

if(mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_SOURCE|MIXER_OBJECTF_HMIXER)!= MMSYSERR_NOERROR)

{

MessageBox(hwnd,"GetLinInfo Resource faile!","Error",MB_OK);

continue;

}

if(mxl.dwComponentType==MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT)

break;

MessageBox(hwnd,"OK","",MB_OK);

if(i==num)

{

MessageBox(hwnd,"GetLinInfo Resource faile!","Error",MB_OK);

return FALSE;

}

}

}

m_controlnum=mxl.cChannels; //声道数量

MIXERCONTROL mxc;

MIXERLINECONTROLS mxlc;

mxlc.cbStruct = sizeof(MIXERLINECONTROLS);

mxlc.dwLineID = mxl.dwLineID;

mxlc.dwControlType =MIXERCONTROL_CONTROLTYPE_VOLUME;

mxlc.cControls =1;

mxlc.cbmxctrl = sizeof(MIXERCONTROL);

mxlc.pamxctrl = &mxc;

if (mixerGetLineControls((HMIXEROBJ)hMixer,

&mxlc,MIXER_OBJECTF_HMIXER |

MIXER_GETLINECONTROLSF_ONEBYTYPE )!= MMSYSERR_NOERROR)

return FALSE;

//m_name=mxc.szName;

m_controlid = mxc.dwControlID;

m_min=mxc.Bounds.lMinimum;

m_max= mxc.Bounds.lMaximum;

//sprintf(test,"%d,%d",m_max,m_min);

//MessageBox(hwnd,test,"",MB_OK);

MIXERCONTROLDETAILS_SIGNED mxcdVolume[2];

MIXERCONTROLDETAILS mxcd;

mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mxcd.dwControlID = m_controlid;

mxcd.cChannels = m_controlnum;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);

mxcd.paDetails = mxcdVolume;

if (mixerGetControlDetails((HMIXEROBJ)hMixer,

&mxcd,MIXER_OBJECTF_HMIXER |

MIXER_GETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)

return FALSE;

vl=mxcdVolume[0].lValue;

if(m_controlnum==2)

{

vr=mxcdVolume[1].lValue;

}

switch(iChCtrl)

{

case 1:

vl+=3000; //用于声音增大

vr+=3000;

if(vl>=m_max||vr>=m_max)

{

vl=m_max;

vr=m_max;

}

break;

case 2:

vl+=3000; //用于声音增大

vr+=3000;

if(vl>=m_max||vr>=m_max)

{

vl=m_max;

vr=m_max;

}

break;

case 3:

vl-=3000; ////用于声音减小

vr-=3000;

if(vl<=m_min||vr<=m_min)

{

vl=m_min;

vr=m_min;

}

break;

case 4:

vl-=3000; ////用于声音减小

vr-=3000;

if(vl<=m_min||vr<=m_min)

{

vl=m_min;

vr=m_min;

}

break;

}

SendMessage(hwnd,WM_SETSOUND,0,0);

break;

case WM_HOTKEY:

//MessageBox(hwnd,"key down","",MB_OK);

//ShowWindow(hwnd,SW_SHOW);

switch(HIWORD(lParam)) //高字节代表虚拟键

{

case VK_ADD: //增加声音热键

switch(LOWORD(lParam)) //低字节代表控制键

{

case MOD_SHIFT:

//MessageBox(hwnd,"key down","",MB_OK);

iChCtrl=1;

bWave=FALSE;

SendMessage(hwnd,WM_CHOOSEWAY,0,0);

//sprintf(test,"%d",vl);

//MessageBox(hwnd,test,"",MB_OK);

break;

case MOD_CONTROL:

//MessageBox(hwnd,"key down","",MB_OK);

iChCtrl=2;

bWave=TRUE;

SendMessage(hwnd,WM_CHOOSEWAY,0,0);

break;

default:

break;

}

break;

case VK_SUBTRACT: //降低声音热键

switch(LOWORD(lParam))

{

case MOD_SHIFT:

//MessageBox(hwnd,"key down","",MB_OK);

iChCtrl=3;

bWave=FALSE;

//sprintf(test,"%d",vr);

//MessageBox(hwnd,test,"",MB_OK);

SendMessage(hwnd,WM_CHOOSEWAY,0,0);

break;

case MOD_CONTROL:

//MessageBox(hwnd,"key down","",MB_OK);

iChCtrl=4;

bWave=TRUE;

SendMessage(hwnd,WM_CHOOSEWAY,0,0);

break;

default:

break;

}

break;

case VK_MULTIPLY: // 设置静音

/*MIXERLINE mxl; //混频器线路数

mxl.cbStruct = sizeof(MIXERLINE);//必须初始化

mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;

if (mixerGetLineInfo((HMIXEROBJ)hMixer,

&mxl,MIXER_OBJECTF_HMIXER |

MIXER_GETLINEINFOF_COMPONENTTYPE)!= MMSYSERR_NOERROR)

return FALSE;

MIXERCONTROL mxc;

MIXERLINECONTROLS mxlc;

mxlc.cbStruct = sizeof(MIXERLINECONTROLS);

mxlc.dwLineID = mxl.dwLineID;

mxlc.dwControlType =MIXERCONTROL_CONTROLTYPE_VOLUME;

mxlc.cControls =1;

mxlc.cbmxctrl = sizeof(MIXERCONTROL);

mxlc.pamxctrl = &mxc;

if (mixerGetLineControls((HMIXEROBJ)hMixer,

&mxlc,MIXER_OBJECTF_HMIXER |

MIXER_GETLINECONTROLSF_ONEBYTYPE )!= MMSYSERR_NOERROR)

return FALSE;

MIXERCONTROLDETAILS_SIGNED mxcdVolume[2];

MIXERCONTROLDETAILS mxcd;

mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mxcd.dwControlID = m_controlid;

mxcd.cChannels = m_controlnum;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);

mxcd.paDetails = mxcdVolume;

if (mixerGetControlDetails((HMIXEROBJ)hMixer,

&mxcd,MIXER_OBJECTF_HMIXER |

MIXER_GETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)

return FALSE;

vl=mxcdVolume[0].lValue;

if(m_controlnum==2)

{

vr=mxcdVolume[1].lValue;

}

if(hMixer==NULL)

return FALSE;

MIXERCONTROLDETAILS_BOOLEAN mxcdMute;

MIXERCONTROLDETAILS mxcd;

mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mxcd.dwControlID = m_controlid;

mxcd.cChannels = 1;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);

mxcd.paDetails =&mxcdMute;

if (::mixerGetControlDetails((HMIXEROBJ)hMixer,

&mxcd,

MIXER_OBJECTF_HMIXER |

MIXER_GETCONTROLDETAILSF_VALUE)

!= MMSYSERR_NOERROR)

return FALSE;

mxcdMute.fValue=!mxcdMute.fValue;

if (::mixerSetControlDetails((HMIXEROBJ)hMixer,

&mxcd,

MIXER_OBJECTF_HMIXER |

MIXER_SETCONTROLDETAILSF_VALUE)

!= MMSYSERR_NOERROR)

return FALSE;

break;

}*/

bNoVoilce=!bNoVoilce;

break;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case ID_START:

//写入注册表项

lpBuffer=new char[512];

memset(lpBuffer,0,512);

GetCurrentDirectory(MAX_PATH,lpBuffer);

strcat(lpBuffer,"\volumeCtrl.exe");

RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",

0,NULL,REG_OPTION_NON_VOLATILE,

KEY_ALL_ACCESS,NULL,&hKey,&dwRegAttr);

RegSetValueEx(hKey,"volumectrl",0,REG_SZ,(CONST BYTE*)lpBuffer,(DWORD)strlen(lpBuffer)+1);

RegCloseKey(hKey);

delete []lpBuffer;

lpBuffer=NULL;

bChMenu=TRUE;

break;

case ID_UNSTART:

//删除注册表项

RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",

0,NULL,REG_OPTION_NON_VOLATILE,

KEY_ALL_ACCESS,NULL,&hKey,&dwRegAttr);

RegDeleteValue(hKey,"volumectrl");

RegCloseKey(hKey);

bChMenu=FALSE;

break;

case ID_EXIT:

//程序退出时关闭音频设备句柄

mixerClose(hMixer);

hMixer = NULL;

TrayMessage(hwnd,NIM_DELETE,hIcon, "");

UnregisterHotKey(hwnd,0xC010);

UnregisterHotKey(hwnd,0xC011);

UnregisterHotKey(hwnd,0xC012);

UnregisterHotKey(hwnd,0xC013);

UnregisterHotKey(hwnd,0xC014);

PostQuitMessage(0);

break;

}

break;

case WM_MY_TRAY_NOTIFICATION:

switch (lParam)

{

case WM_RBUTTONDOWN:

//此处显示右键菜单

HMENU hMainMenu,hmenuTrackPopup; //菜单句柄

POINT pt;

if(bChMenu==FALSE)

{

hMainMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDM_MAINMENU));

hmenuTrackPopup = GetSubMenu(hMainMenu, 0);

ClientToScreen(hwnd,(LPPOINT)&pt);

if(!GetCursorPos(&pt))

return FALSE;

if(!TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN ,pt.x,pt.y,0,hwnd,NULL))

return FALSE;

}

else

{

hMainMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_BACKUPMENU));

hmenuTrackPopup = GetSubMenu(hMainMenu, 0);

ClientToScreen(hwnd,(LPPOINT)&pt);

if(!GetCursorPos(&pt))

return FALSE;

if(!TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN ,pt.x,pt.y,0,hwnd,NULL))

return FALSE;

}

break;

}

break;

case WM_SETSOUND:

//sprintf(test,"%d",vr);

//MessageBox(hwnd,test,"",MB_OK);

if(bNoVoilce)

{

SendMessage(hwnd,WM_CHOOSEWAY,0,0);

mxcdVolume[0].lValue=m_min;

if(m_controlnum==2)

{

mxcdVolume[1].lValue=m_min;

}

}

else

{

mxcdVolume[0].lValue=vl;

if(m_controlnum==2)

{

mxcdVolume[1].lValue=vr;

}

}

mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mxcd.dwControlID = m_controlid;

mxcd.cChannels = m_controlnum;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);

mxcd.paDetails = mxcdVolume;

if (mixerSetControlDetails((HMIXEROBJ)hMixer,

&mxcd,MIXER_OBJECTF_HMIXER |

MIXER_SETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)

return FALSE;

break;

}

return DefWindowProc(hwnd,message,wParam,lParam);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有