在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

運用鍵盤鉤子開發按鍵發音程序

運用鍵盤鉤子開發按鍵發音程序

更新時間:2022-05-01 文章作者:未知 信息來源:網絡 閱讀次數:

一、前言
一日,看見我媽正在用電腦練習打字,頻頻低頭看鍵盤,我想:要是鍵盤能發音的話,不就可以方便她養成"盲打"的好習慣嗎?光想不做可不行,開始行動(您可千萬別急著去拿工具箱啊^_^)...
按鍵能發音,其關鍵就是讓程序能夠知道當前鍵盤上是哪個鍵被按下,并播放相應的聲音,自己的程序當然不在話下,那么其它程序當前按下哪個鍵如何得知呢?利用鍵盤鉤子便可以很好地解決。

下載本文的全部源代碼 大小:552K

二、掛鉤(HOOK)的基本原理
WINDOWS調用掛接的回調函數時首先會調用位于函數鏈首的函數,我們只要將自己的回調函數置于鏈首,該回調函數就會首先被調用。那么如何將我們自己的回調函數置于函數鏈的鏈首呢?函數SetWindowsHookEx()實現的就是該功能。我們首先來看一下SetWindowsHookEx函數的原型:


HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
第一個參數:指定鉤子的類型,有WH_MOUSE、WH_KEYBOARD等十多種(具體參見MSDN)
第二個參數:標識鉤子函數的入口地址
第三個參數:鉤子函數所在模塊的句柄;
第四個參數:鉤子相關函數的ID用以指定想讓鉤子去鉤哪個線程,為0時則攔截整個系統的消息。

另外需要注意的是為了捕獲所有事件,掛鉤函數應該放在動態鏈接庫DLL中。

三、具體實現
理論的話就不多說了,運行VC++6.0,新建一個MFC AppWizard(dll)工程,命名為Hook,使用默認的創建DLL類型的選項,也就是使用共享MFC DLL,點擊完成后開始編寫代碼:

(1)在Hook.h中定義全局函數
BOOL installhook(); //鉤子安裝函數
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);//掛鉤函數

(2)在Hook.cpp文件的#endif下添加定義全局變量Hook的代碼:
static HHOOK hkb=NULL;
HINSTANCE hins; //鉤子函數所在模塊的句柄
(3)添加核心代碼
BOOL installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return TRUE;
}
第一個參數指定鉤子的類型,因為我們只用到鍵盤操作所以設定為WH_KEYBOARD;第二個參數將鉤子函數的入口地址指定為KeyboardProc,當鉤子鉤到任何消息后便調用這個函數,即當不管系統的哪個窗口有鍵盤輸入馬上會引起KeyboardProc的動作;第三個參數是鉤子函數所在模塊的句柄;最后一個參數是鉤子相關函數的ID用以指定想讓鉤子去鉤哪個線程,為0時則攔截整個系統的消息;
現在,就開始定義當鍵盤上的鍵按下時程序要做什么了~
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模式可以及時地釋放正在播放的聲音文件,立刻停止當前聲音的播放轉去播放新的聲音,這樣在我們連續擊鍵時就不會有阻塞感了.

(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后打開記事本或寫字板,體驗一下系統為您即時快速地朗讀您按下的每一個鍵的快感吧^-^

有一點必須說明,標準鍵盤有101個鍵,您想讓多少鍵發聲音,就必須在上面的KeyboardProc動作里定義多少個鍵,常用的10個數字鍵和26個英文字母不會給您帶來太大的困難,只要相應的'A'對應A鍵,'1'對應1鍵就可以,但如果您希望能讓更多的鍵都有各種特色音樂的話,很可能會遇到一些鍵盤編碼上的麻煩,比如ESC鍵就不能簡單的用'ESC'來搞定了,得用VK_ESCAPE,又比如Alt鍵得用VK_MENU來定義,沒有個鍵盤編碼表的話會令人相當頭疼,這里我介紹一種讓程序來告訴您鍵盤按鍵名稱的方法:
為一個工程添加PreTranslateMessage映射,添加如下代碼:


char KeyName[50];
ZeroMemory(KeyName,50);
if(pMsg -> message == WM_KEYDOWN)
{
GetKeyNameText(pMsg->lParam,KeyName,50);
MessageBox(KeyName);
}
那么當程序窗口顯示在面前時按下某個鍵,就會彈出一個消息顯示該鍵的名稱,然后用''包起來就可以了,比如逗號句號,就是','和'.',簡單吧:)
到此就全部完成了按鍵發音程序的編寫,通過改變聲音文件的名稱而不用改動程序本身就可以達到更換按鍵聲音的目的了,只是有個遺憾,聲音文件在硬盤中的位置不能變更,從C盤換移動D盤程序就不能播放了,怎么樣才能靈活的讀取聲音文件呢?可以用API函數GetModuleFileName來得到程序所在的目錄,具體實現方法如下:
(1)在Hook.h的public:下面添加:


BOOL InitInstance(); //初始化函數
(2)在Hook.cpp的#endif下添加定義全局變量的代碼:


char szBuf[256];
char *p;
CString msg;
(3)在Hook.cpp中適當位置添加:


BOOL CHookApp::InitInstance ()
{
GetModuleFileName(AfxGetInstanceHandle( ),szBuf,sizeof(szBuf));
p = szBuf;
while(strchr(p,'\\'))
{
p = strchr(p,'\\');
p++;
}
*p = '\0';
msg=szBuf;
return TRUE;
}
(4)新建一個文件夾并命名為Sound;

(5)改變聲音文件物理位置定義方式
case '1':sndPlaySound(msg+"sound\\1.wav",SND_ASYNC);break;
msg是得到程序當前所在目錄,加上后面的代碼就是指播放當前目錄下的Sound目錄里的1.wav文件,這樣就將聲音文件的絕對路徑改成了靈活的相對路徑.您只要把KeySound.exe,Hook.dll和Sound文件夾放在同一個文件夾下,以后只要搬動整個文件夾就能實現聲音文件的任意移動了。

調試時需要注意:將Hook.dll、Sound目錄放在KeySound.exe的執行目錄下。假如編譯鏈接的時候出現unresolved external symbol __imp__sndPlaySoundA@8 這樣的信息,請在Project Settings中加入Winmm.lib 。 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 人妻少妇精品无码专区二区| 欧美成人手机在线视频| 欧美在线观看www| 玖玖爱视频在线| 黄色激情在线视频| 男人午夜视频在线观看| 免费看国产曰批40分钟| 一区二区三区四区毛片| 人人妻人人添人人爽欧美一区| 拔插拔插华人永久免费| 霍思燕三级露全乳照| 99re6在线观看| 国产精品涩涩涩视频网站| a级片一区二区| 天天综合中文字幕| 自拍偷拍一区二区三区四区| 97国产在线播放| 国产中文字幕二区| 免费视频爱爱太爽了| 老司机午夜网站| 日日夜夜精品视频免费观看| 欧美精品成人网| 不卡的在线视频| 香蕉精品视频在线| 亚洲成人动漫在线| 久久综合久久网| 欧美三级一级片| 国产精品区在线| 九九九九九国产| 国产高清www| 午夜欧美福利视频| 国产又黄又爽免费视频| 青青青青在线视频| 三级在线视频观看| 一区二区三区四区免费观看| 国产夫妻自拍一区| 在线观看岛国av| 成人免费观看cn| 超碰在线免费观看97| 久久久亚洲精品无码| www.污网站| 亚洲欧美激情网| 国产手机免费视频| 国产无遮挡猛进猛出免费软件 | 久久久久久综合网| 蜜桃免费在线视频| 黄色大片中文字幕| 国产又粗又猛又爽又黄的网站| 天堂网在线免费观看| 黄色免费视频大全| 女性女同性aⅴ免费观女性恋| 久久免费看毛片| 三级黄色片免费观看| www.com黄色片| 欧美伦理片在线观看| 国产91对白刺激露脸在线观看| 国产一区二区三区在线免费| 91免费网站视频| 国产精品igao激情视频| 青草全福视在线| www.日本少妇| 凹凸日日摸日日碰夜夜爽1| 免费成人午夜视频| 黄色一级大片在线观看| 中文av一区二区三区| 色一情一区二区三区| 51xx午夜影福利| 欧美啪啪免费视频| 午夜剧场高清版免费观看| 在线观看中文av| 亚洲熟妇无码另类久久久| 无码人妻少妇伦在线电影| a天堂资源在线观看| 男女无套免费视频网站动漫| www.com污| 精品99在线视频| 免费看日本黄色| 三上悠亚av一区二区三区| 日本成人性视频| 538任你躁在线精品免费| 肉大捧一出免费观看网站在线播放 | 91精品国产吴梦梦| 日韩人妻精品无码一区二区三区| 91高清国产视频| 免费在线激情视频| 久久久99精品视频| 中文字幕av专区| 九色91popny| 人妻精品无码一区二区三区| 欧美狂野激情性xxxx在线观| 欧美日韩亚洲自拍| 免费午夜视频在线观看| 九一免费在线观看| 性欧美在线视频| 午夜激情视频网| 善良的小姨在线| 992tv快乐视频| 国产一区二区三区播放| 日本福利视频网站| 特级西西人体www高清大胆| 特级毛片在线免费观看| 国产又粗又长又爽又黄的视频| www.久久91| 成人高清dvd| 欧美亚洲日本一区二区三区| www.日日操| 五月天国产视频| 玩弄中年熟妇正在播放| 久章草在线视频| 国内国产精品天干天干| 免费超爽大片黄| 国产三级三级看三级| a级网站在线观看| 欧美自拍小视频| 日产精品久久久久久久蜜臀| 国产91对白刺激露脸在线观看| 久久国产精品国产精品| 国产av国片精品| 在线观看日本www| 成人午夜视频免费在线观看| 国产在线拍揄自揄拍无码| 激情综合在线观看| 轻点好疼好大好爽视频| 日本超碰在线观看| 男人亚洲天堂网| 丁香花在线影院观看在线播放| 国产三级国产精品国产专区50| 国产精品无码免费专区午夜| 天天干天天操天天做| 精品无码国产一区二区三区av| av无码精品一区二区三区| 国产乱子伦精品无码专区| 99精品视频网站| 91网址在线观看精品| 91免费视频污| 99精品视频网站| www国产免费| 日韩中文在线字幕| 国产精品一色哟哟| 国产日韩欧美精品在线观看| 日本a级片在线播放| 免费观看国产视频在线| 国产91视频一区| 夜夜添无码一区二区三区| 乱妇乱女熟妇熟女网站| 欧美一级黄色片视频| 亚洲少妇久久久| 一本二本三本亚洲码| 欧美高清中文字幕| 久久久国产欧美| av女优在线播放| 免费毛片网站在线观看| 国产精品国产亚洲精品看不卡 | 成年人免费在线播放| av网站在线不卡| 日日摸日日碰夜夜爽无码| 国产理论在线播放| 欧美午夜小视频| 污污的网站免费| 日日碰狠狠躁久久躁婷婷| 99精品一区二区三区的区别| 国产xxxxx在线观看| 黄色网zhan| gogogo免费高清日本写真| 欧美成人精品欧美一级乱| 成人污网站在线观看| 午夜宅男在线视频| 国产1区2区在线| 欧美日韩在线一| 99在线精品免费视频| 国产日产欧美一区二区| 一起操在线视频| aaa一级黄色片| 国产精欧美一区二区三区白种人| 成年人网站大全| 欧美黄色一级片视频| 婷婷丁香激情网| 色一情一区二区| 亚洲天堂国产视频| 亚洲精品在线网址| www.51色.com| 欧美日韩不卡在线视频| 久草热视频在线观看| 国产精品天天av精麻传媒| 免费在线观看的毛片| 免费成年人高清视频| 亚洲黄色av片| heyzo亚洲| 女人高潮一级片| 丝袜人妻一区二区三区| 在线免费观看av的网站| 手机av在线网站| 国模杨依粉嫩蝴蝶150p| 亚洲最大天堂网| 国产乱子伦农村叉叉叉| 亚洲第一狼人区| 无码人妻丰满熟妇区96| 亚洲欧美一区二区三区不卡| 欧美网站免费观看| 国产大尺度在线观看|