消除笔记本的高频电流噪音.doc

上传人:cl****1 文档编号:543109088 上传时间:2023-01-10 格式:DOC 页数:7 大小:43KB
返回 下载 相关 举报
消除笔记本的高频电流噪音.doc_第1页
第1页 / 共7页
消除笔记本的高频电流噪音.doc_第2页
第2页 / 共7页
消除笔记本的高频电流噪音.doc_第3页
第3页 / 共7页
消除笔记本的高频电流噪音.doc_第4页
第4页 / 共7页
消除笔记本的高频电流噪音.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《消除笔记本的高频电流噪音.doc》由会员分享,可在线阅读,更多相关《消除笔记本的高频电流噪音.doc(7页珍藏版)》请在金锄头文库上搜索。

1、消除笔记本的高频电流噪音季光.dum摘要:有些笔记本在使用中发出一种高频电流噪音。这种噪音随着硬盘的读写,用户对窗口界面中的滚动条的拉动发生变化,并在操作系统启动之后几乎始终存在,只有当用户播放音频文件时这种噪音会消失。本文利用这一特点针对Windows操作系统给出了消除噪音解决方案。本文设计了一个占用资源较少的Windows系统服务,在里面模拟音频文件的播放,从而将噪音消除。关键字:笔记本高频电流噪音Windows系统服务问题分析有些笔记本由于设计方面的问题,如果使用了USB设备或蓝牙模块,在运行中会发出一种高频电流噪音。例子包括Dell D610,Think R60e(在使用电池的模式下)

2、。这种噪音的来源并未得到官方的解释。但是有些厂商已经发布了修复这种噪音问题的BIOS补丁1。但是某些厂商并未正面解决这个问题2。有一种比较方便易行的方法可以把这种噪音消除:播放一个音频文件,然后按下暂停按钮。某些用户反映在运行一些游戏时也可以将噪音消除,其实也是利用了游戏背景音乐的作用。但是这种方法的缺点是需要手工操作,并且音乐播放器往往占用大量的内存。我们应该考虑用一种节省的方式实现它。设计与实现Windows提供了一组波形音频的编程接口。我们可以利用它们模拟播放器的暂停状态:/代码:模拟播放器的暂停状态HWAVEOUThWaveOut;/波形音频输出句柄BYTEmuteMUTE_LENGT

3、H;/静音符号串WAVEFORMATEXwaveformat=WAVE_FORMAT_PCM,1,SAMPLE_RATE,SAMPLE_RATE,1,8,0;/设定波形音频的格式WAVEHDRwaveHdr=0,MUTE_LENGTH,0,0,0,1,NULL,0;/音频数据信息头FillMemory(mute,MUTE_LENGTH,(BYTE)0x80);/用静音符号填充waveHdr.lpData=mute;/初始化信息头指针/打开音频设备waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveformat,0,0,CALLBACK_FUNCTION);/准备信息头

4、waveOutPrepareHeader(hWaveOut,&waveHdr,sizeof(WAVEHDR);/播放静音符号waveOutWrite(hWaveOut,&waveHdr,sizeof(WAVEHDR);/暂停waveOutPause(hWaveOut);利用这段代码写一个win32程序,保证程序进程不会退出(可利用一个含有Sleep调用的死循环或弹出一个模态对话框实现),即可实现消除噪音的作用。然而这样做仍然不够完善。我们希望系统在启动的时候,无论有用户登录与否,都能够自动地调用它。为了解决这一问题,我们应当把它改造为Windows的系统服务。Windows系统服务的编写需要服

5、从一定的格式规范,请参阅相关文献3,本文不予详述。需要注意的是,如果编写为独立的Windows服务,仍然需要1,900K左右的内存;如果编写为寄存在svchost中的服务4,则可以把内存占用量大大降低,达到300400K。本文采用了后者。完整代码如下(我们把服务名取作DenoiseSvc31):/*消电流噪声svchost版3.1*/#include#include#defineSLEEP_TIME10000#defineSERVICE_NAMEDenoiseSvc31 /服务名#defineMUTE_LENGTH128#defineSAMPLE_RATE11025SERVICE_STATUS

6、ServiceStatus;SERVICE_STATUS_HANDLEhStatus;voidInitService(void)HWAVEOUThWaveOut;BYTEmuteMUTE_LENGTH;WAVEFORMATEXwaveformat=WAVE_FORMAT_PCM,1,SAMPLE_RATE,SAMPLE_RATE,1,8,0;WAVEHDRwaveHdr=0,MUTE_LENGTH,0,0,0,1,NULL,0;FillMemory(mute,MUTE_LENGTH,(BYTE)0x80);waveHdr.lpData=mute;waveOutOpen(&hWaveOut,WA

7、VE_MAPPER,&waveformat,0,0,CALLBACK_FUNCTION);waveOutPrepareHeader(hWaveOut,&waveHdr,sizeof(WAVEHDR);waveOutWrite(hWaveOut,&waveHdr,sizeof(WAVEHDR);waveOutPause(hWaveOut);voidControlHandler(DWORDrequest)switch(request)caseSERVICE_CONTROL_STOP:caseSERVICE_CONTROL_SHUTDOWN:ServiceStatus.dwWin32ExitCode

8、=0;ServiceStatus.dwCurrentState=SERVICE_STOPPED;SetServiceStatus(hStatus,&ServiceStatus);return;default:break;/ReportcurrentstatusSetServiceStatus(hStatus,&ServiceStatus);return;#pragmaargsused_declspec(dllexport)VOIDWINAPIServiceMain(DWORDdwArgc,LPTSTR*lpszArgv)ServiceStatus.dwServiceType=SERVICE_W

9、IN32_SHARE_PROCESS;ServiceStatus.dwCurrentState=SERVICE_START_PENDING;ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;ServiceStatus.dwWin32ExitCode=0;ServiceStatus.dwServiceSpecificExitCode=0;ServiceStatus.dwCheckPoint=0;ServiceStatus.dwWaitHint=0;hStatus=RegisterService

10、CtrlHandler(SERVICE_NAME,(LPHANDLER_FUNCTION)ControlHandler);if(hStatus=(SERVICE_STATUS_HANDLE)0)/RegisteringControlHandlerfailedreturn;/InitializeServiceInitService();/WereporttherunningstatustoSCM.ServiceStatus.dwCurrentState=SERVICE_RUNNING;SetServiceStatus(hStatus,&ServiceStatus);/Theworkerloopo

11、faservicewhile(ServiceStatus.dwCurrentState=SERVICE_RUNNING)Sleep(SLEEP_TIME);return;Svchost服务要求可执行文件必须为动态链接库。我们把它编译为denoise.dll并拷贝到%windir%system32目录下。剩下的任务就是把它安装到系统上。为系统添加一个服务需要修改注册表。对于Svchost服务,需要修改的地方包括:l HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvcHost:把服务添加到某个Svchost组内。l HKEY

12、_LOCAL_MACHINESYSTEMCurrentControlSetServices:添加服务的主键及相关键值。代码如下:Windows Registry Editor Version 5.00HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDenoiseSvc31Type=dword:00000020Start=dword:00000002ErrorControl=dword:00000001ImagePath=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f

13、,00, 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73, 00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00, 6b,00,20,00,48,00,54,00,54,00,50,00,46,00,69,00,6c,00,74,00,65,00,72,00,00, 00DisplayName=DenoiseSvc31DependOnService=hex(7):4c,00,61,00,6e,00,6d,00,61,00,6e,00,57,00,6f,00,72,00, 6b,00,73,00,74,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00DependOnGroup=hex(7):00,00ObjectNam

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号