当前位置:文档之家› 键盘接口

键盘接口


DWORD dwThreadId //指定监视的线程。若为NULL,则为全局钩子
);
注:全局钩子函数必须在DLL(动态链接库)中建立。
编程实例:运用Hook技术获取按键。当按键时,播放声音(该键的名称)。 (1)建立MFC DLL,安装按键钩子,并实时播放声音。
启动VC++,选 File\New,在Project选卡中:
选Project/Setings,按如下操作:
注意:Win32 Debug也按此 操作
选Build/Batch Build,按如下操作:
1
2
于是,就生成了KeyHook.dll文件。
DLL文件不能独立运行,只能由可执行文件来调用。 下面来编程,生成调用此DLL的可执行文件KeyPress.EXE
扫描码(串行数据)
至PC机键盘接口
L1
输出 L2
单片机
L3
R0 输入 R1
R2 R3
K00 K01 K02 K03 K10 K11 K12 K13 K20 K21 K22 K23 K30 K31 K32 K33
KLR
(2)键盘内部电路的键扫描工作原理
L3..0=1110
读R3..0
R3..0=1111? 本行无键按下, Y
L3..0=1101
读R3..0
R3..0=1111? 本行无键按下, Y
……
扫描码:
行号、列号拼成字节
N,本行有键按下 判断,处理
N,本行有键按下 判断,处理
二 PC机的键盘接口电路
并行数据
D7..D0
D7..D0 PA
8088
8255
INTR
CS
60H~63H
串/并 转换
来自键盘 的扫描码
串行数据
系统维护着一个钩子链,最近安装的钩子总放在链的开始。
怎样安装Hook?
调用API函数:
HHOOK SetWindowsHookEx(
int idHook,
//钩子的类型,按键为 WH_KEYBOARD
HOOKPROC lpfn,
//钩子函数的地址
HINSTANCE hMod,
//包含钩子函数的模块句柄
(2)建立MFC EXE,用于加载KeyHook.dll。 启动VC++,选 File\New,在Project选卡中:
在MFC AppWizard _ step 1 中:
在Keypress.cpp中的OnInitDialog()函数中添加 (见红框内):
BOOL CKeyPressDlg::OnInitDialog() {
{ if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode)) { switch(wParam){ case 'A': sndPlaySound("sound\\a.wav",SND_ASYNC); break; case ‘B': …… sndPlaySound("sound\\2.wav",SND_ASYNC); break; case 'Z': sndPlaySound("sound\\z.wav",SND_ASYNC); break; } }
instkbhook=(inshook)GetProcAddress(hinstDLL, "installhook"); instkbhook(); }
return TRUE; // return TRUE unless you set the focus to a control }
编译、连接,生成KeypRess.exe文件; 将KeyHoook.dll文件拷贝到KeypRess.exe文件所在的目录内; 在KeyPress.exe文件所在的目录内建立sound子目录;
INT IRQ1 8259
CPU响应IRQ1中断后,可读取 8255 PA 口的数据: Key = inprotb(0x60);
三 PC机的键盘接口编程举例
例1 拦截IRQ1中断,读取 8255 PA 口的键盘扫描码。
注: 8255 PA 口的I/O地址为60H; IRQ1为键盘中断,按下和提起都会发生,其中断类型号 用 TC 编程。
为9;例2 运用Window来自 Hook(钩子)技术获取按键。
Windows环境下,用户程序一般不使用中断。或使用线程技术,或使用Hook(钩子) 技术。
什么是Hook?
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定 的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,得到控制权。钩子 函数先处理该消息,再向系统传递该消息。也可以丢弃该消息。
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam ); return(RetVal); }
选View/MFC ClassWizard,按如下操作:
2 3 1
上步完成后,在KeyHook.cpp最后出现InitInstance()函数,在该 函数中添加代码(见红框):
在MFC AppWizard _ step 1 of 1中:
在KeyHook.h文件中添加代码(见红框部分):
在KeyHook.cpp文件中添加代码(见红框部分):
在KeyHook.cpp文件中写上如下回调函数:
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
…… // TODO: Add extra initialization here
static HINSTANCE hinstDLL; typedef BOOL (CALLBACK *inshook)(); inshook instkbhook; if(hinstDLL=LoadLibrary((LPCTSTR)"keyhook.dll")) {
第3章 人机交互接口
本章概要
人机交互接口是人与计算机打交道的接口电路。本 章主要介绍 3 种常用人机交互接口:
键盘接口 显示器接口 鼠标接口 本章将在Windows下,以VC++6.0为开发工具, 编程访问上述接口。
第1节 键盘接口
一 键盘的工作原理
(1)键盘内部的电路结构(以4 ×4键盘为例)
L0
相关主题