利用键盘钩子开发按键发音程序
2010-01-09 20:31:49 来源:WEB开发网现在,就开始定义当键盘上的键按下时程序要做什么了~
KeyboardProc动作:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam) //键盘按键标识
{
case '1':sndPlaySound("1.wav",SND_ASYNC);break; //当 数字键1被按下
case '2':sndPlaySound ("2.wav",SND_ASYNC);break;
case '3':sndPlaySound ("3.wav",SND_ASYNC);break;
case '4':sndPlaySound ("4.wav",SND_ASYNC);break;
....
case 'A':sndPlaySound("a.wav",SND_ASYNC);break; //当字母键A被按下
case 'B':sndPlaySound("b.wav",SND_ASYNC);break;
case 'C':sndPlaySound("c.wav",SND_ASYNC);break;
case 'D':sndPlaySound("d.wav",SND_ASYNC);break;
....
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
上面的代码中我们用播放声音做为按键被按下后的动作,API 函数sndPlaySound的第一个参数定义的声音文件的绝对路径(比如要播放C盘下的a.wav,就定义成 "C:\\a.wav");第二参数定义播放模式,SND_ASYNC模式可以及时地释放正在播放的声音文件 ,立刻停止当前声音的播放转去播放新的声音,这样在我们连续击键时就不会有阻塞感了.为了执行 sndPlaySound函数,必须在Hook.cpp的文件头加上:
#include "mmsystem.h"
并且点击VC++菜单上的“工程”-“设置”进 入Link属性页,在L对象/库模块下输入:winmm.lib后确定即可.
(4)添加输出标识
在 Hook.def的末尾添加
installhook
KeyboardProc
短短的四步,键盘钩子的制作算是完成了,编译生成后的DLL文件就可以自由的用别的程序来调用了.
在程序中如何调用DLL呢?那就简单了.再用VC++6.0新建一个MFC AppWizard(exe)工程,命名为KeySound,点击"确定 "后选择程序类型为对话框,直接点击确定即可.
在KeySoundDlg.cpp文件中的OnInitDialog()初始化函数的CDialog::OnInitDialog();下面添加:
//阻止程序反复驻留内存,也为了防止有两个程序同时读取DLL而发生错误.
CreateMutex(NULL, FALSE, "KeySound");
if(GetLastError()==ERROR_ALREADY_EXISTS)
OnOK();
//读取DLL
static HINSTANCE hinstDLL;
typedef BOOL (CALLBACK *inshook)();
inshook instkbhook;
if(hinstDLL=LoadLibrary((LPCTSTR)"Hook.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook");
instkbhook();
}
else
{
MessageBox("当前目录找不到Hook.dll文件 ,程序初始化失败");
OnOK();
}
将编译生成后的KeySound.exe和 Hook.dll放在同一目录下,定义好声音文件,运行KeySound.exe后打开记事本或写字板,体验一下系统为您即时快速地朗读您按下的每一个键的快感吧^-^
更多精彩
赞助商链接