FreePascalKeyboard单元过程函数详解.doc_第1页
FreePascalKeyboard单元过程函数详解.doc_第2页
FreePascalKeyboard单元过程函数详解.doc_第3页
FreePascalKeyboard单元过程函数详解.doc_第4页
FreePascalKeyboard单元过程函数详解.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

索引:DoneKeyboard FunctionKeyName GetKeyboardDriver GetKeyEvent GetKeyEventChar GetKeyEventCode GetKeyEvntFlags GetKeyEventShiftState GetKeyEventUniCode InitKeyBoard IsFunctionKey KeyEventToString PollKeyEvent PollShiftStateEvent PutKeyEvent SetKeyboardDriverShiftStateToString TranslateKeyEvent TranslateKeyEventUniCode这个单元实现独立于系统的键盘接入层,它可以用来轮询键盘状态,并等待某些事件。等待键盘事件可以通过GetKeyEvent函数来实现,它会返回一个依赖驱动程序的键盘事件。这个事件可以由translatekeyevent函数转换成可解释事件。这个函数的结果可用于其他事件检查函数。一个自定义的键盘驱动程序(keyboard driver)可由SetKeyboardDriver函数安装。当前键盘驱动程序可以用GetKeyBoardDriver检索。使用这个单元,一开始要调用InitKeyboard,最后要调用DoneKeyBoard。(后面的程序都是这样。)注:经测试,下文的功能键指F1F12及方向键和Home、End、Insert、Page Up、Page Down、Delete。下文说的shift应该是指shift、ctrl、alt。检测shift状态时返回结果是这三个键中任意多个被按下或都未按下。常量:以下常量定义了一些错误常量,可能由键盘函数返回:errKbdBase = 1010; errKbdInitError = errKbdBase + 0; errKbdNotImplemented = errKbdBase + 1;以下常量表示指定的键盘按键。第一个常量指定了功能键:const kbdF1 = $FF01; kbdF2 = $FF02; kbdF3 = $FF03; kbdF4 = $FF04; kbdF5 = $FF05; kbdF6 = $FF06; kbdF7 = $FF07; kbdF8 = $FF08; kbdF9 = $FF09; kbdF10 = $FF0A; kbdF11 = $FF0B; kbdF12 = $FF0C; kbdF13 = $FF0D; kbdF14 = $FF0E; kbdF15 = $FF0F; kbdF16 = $FF10; kbdF17 = $FF11; kbdF18 = $FF12; kbdF19 = $FF13; kbdF20 = $FF14;常量$15到$1F为未来的功能键预留。以下常量指定光标移动键:kbdHome = $FF20; kbdUp = $FF21; kbdPgUp = $FF22; kbdLeft = $FF23; kbdMiddle = $FF24; kbdRight = $FF25; kbdEnd = $FF26; kbdDown = $FF27; kbdPgDn = $FF28; kbdInsert = $FF29; kbdDelete = $FF2A;常量$2B到$2F为未来的键盘上的键预留。以下标志也被定义:kbASCII = $00; kbUniCode = $01; kbFnKey = $02; kbPhys = $03; kbReleased = $04;他们可以用来检查键盘事件包含什么样的数据。以下shift状态的标志可以用来决定一个键的shift状态(即按一个键时alt、shift、ctrl是否按下):kbLeftShift = 1; kbRightShift = 2; kbShift = kbLeftShift or kbRightShift; kbCtrl = 4; kbAlt = 8;以下常量字符串用于按键名字函数FunctionKeyName和KeyEventToString:SShift : Array 1.3 of string5 = (SHIFT,CTRL,ALT); LeftRight : Array 1.2 of string5 = (LEFT,RIGHT); UnicodeChar : String = Unicode character ; SScanCode : String = Key with scancode ; SUnknownFunctionKey : String = Unknown function key : ; SAnd : String = AND; SKeyPad : Array 0.($FF2F-kbdHome) of string6 = (Home,Up,PgUp,Left, Middle,Right,End,Down, PgDn,Insert,Delete, ,);他们可以被改成本地化的键名当需要的时候。类型:TKeyEvent类型是键盘事件的基础类型:TKeyEvent = Longint;击键用4字节的TKryEvent类型编码。击键的不同变量编码通过转换TKeyEvent类型到TKETRecord类型。TKeyRecord = packed record KeyCode : Word; ShiftState, Flags : Byte; end;以下为TKeyRecord结构体的解释:变量 意义KeyCode 视于flags,物理表现的一个按键(在dos下扫描码,ASCII码对)或翻译的ASCII/unicode字母。Shiftstate 按下一个键是shift的状态。Flags 决定怎样解释KeyCodeShift的状态可以用不同的shift状态常量检查,最后一个类型中的标记可以用kbASCII、kbUniCode、kbFnKey、kbPhys、kbReleased常量中的一个检查。如果两个按键返回同样的字符按键,没有办法找出按下了哪一个。如果需要知道,未翻译的字符码必须使用,但是这依赖于系统。依赖于系统的常量被定义来覆盖这些,它们有可能有同样的名字。TKeyboardDriver记录可以被用来安装一个自定义的键盘驱动通过使用SetKeyboardDriver函数。Type TKeyboardDriver = Record InitDriver : Procedure; DoneDriver : Procedure; GetKeyEvent : Function : TKeyEvent; PollKeyEvent : Function : TKeyEvent; GetShiftState : Function : Byte; TranslateKeyEvent : Function (KeyEvent: TKeyEvent): TKeyEvent; TranslateKeyEventUniCode: Function (KeyEvent: TKeyEvent): TKeyEvent; end;不同的变量对应这个单元接口部分的不同函数。过程和函数:DoneKeyboard定义:Procedure DoneKeyboard;描述:如果键盘驱动处于活动状态,此过程初始化键盘接口。如果键盘驱动处于非活跃状态,这个过程什么也不做。这会使键盘驱动程序清空任何已分配的内存。或恢复程序在其中运行的控制台或终端到调用InitKeyBoard命令前的状态。这个过程应该在程序结束时调用。不这么做的活可能使终端或控制台窗口处于一个不可用状态。它确切的行动取决于程序运行的平台。 返回页首FunctionKeyName定义:Function FunctionKeyName (KeyCode : Word) : String;描述:将代码为KeyCode的功能键转换为字符串形式返回。这可以是一个实际的功能键,也可以是光标移动键。错误:如果keycode不包含功能键,返回SUnknownFunctionKey字符串,并在其后添加KeyCode。例子:Program Example8; Program to demonstrate the FunctionKeyName function. Uses keyboard; Var K : TkeyEvent; begin InitKeyboard; Writeln(Press function keys, press q to end.); Repeat K:=GetKeyEvent; K:=TranslateKeyEvent(K); If IsFunctionKey(k) then begin Write(Got function key : ); Writeln(FunctionKeyName(TkeyRecord(K).KeyCode); end; Until (GetKeyEventChar(K)=q); DoneKeyboard; end. 返回页首GetKeyboardDriver定义:Procedure GetKeyboardDriver (Var Driver : TKeyboardDriver);描述:通过driver返回当前活跃打键盘驱动程序。这个过程可以用来加强现有的键盘驱动程序。 返回页首GetKeyEvent定义:function GetKeyEvent: TKeyEvent;描述:返回上一个键盘事件如果一个被储存在PendingKeyEvent中,或者等待一个如果没有可见的(意思是有键按下就返回,没有就等待直到有键按下)。在PollKeyEvent中一个非阻塞的版本是可用的。错误:没见按下,返回0.例子:program example1; This program demonstrates the GetKeyEvent function uses keyboard; Var K : TKeyEvent; begin InitKeyBoard; Writeln(Press keys, press q to end.); Repeat K:=GetKeyEvent; Write(Got key event with ); Case GetKeyEventFlags(K) of kbASCII : Writeln(ASCII key); kbUniCode : Writeln(Unicode key); kbFnKey : Writeln(Function key); kbPhys : Writeln(Physical key); kbReleased : Writeln(Released key event); end; K:=TranslateKeyEvent(K); Writeln(Got key : ,KeyEventToString(K); Until (GetKeyEventChar(K)=q); DoneKeyBoard; end. 返回页首GetKeyEventChar定义:function GetKeyEventChar(KeyEvent: TKeyEvent): Char;描述:返回keyevent的字符码部分如果它包含一个翻译的字符键的键码。字符码是按下的字符键的ASCII码。如果他返回空字符表示这个键不是字符键,是功能键。 返回页首GetKeyEventCode定义:function GetKeyEventCode(KeyEvent: TKeyEvent): Word;描述:返回翻译后的keyevent的功能键码部分,如果它包含一个翻译的功能键。如果按下的键不是功能键,返回空。例子:Program Example2; Program to demonstrate the GetKeyEventCode function. Uses keyboard; Var K : TKeyEvent; begin InitKeyBoard; Writeln(Press function keys, or press q to end.); Repeat K:=GetKeyEvent; K:=TranslateKeyEvent(K); If (GetKeyEventFlags(K)KbfnKey) then Writeln(Not a function key) else begin Write(Got key (,GetKeyEventCode(K); Writeln() : ,KeyEventToString(K); end; Until (GetKeyEventChar(K)=q); DoneKeyboard; end. 返回页首GetKeyEvntFlags定义:function GetKeyEventFlags(KeyEvent: TKeyEvent): Byte;描述:返回KeyEvent的标记部分。 返回页首GetKeyEventShiftState定义:function GetKeyEventShiftState(KeyEvent: TKeyEvent): Byte;描述:返回keyevent的shift状态的值,这可以用来检测shift、ctrl、alt那个被按下。如果都没按下,返回0.这个函数返回的结果不一定正确。在unix x-term中,这些修饰符不一定起作用。例子:Program Example3; Program to demonstrate the GetKeyEventShiftState function. Uses keyboard; Var K : TKeyEvent; S : Byte; begin InitKeyBoard; Write(Press keys combined with CTRL/SHIFT/ALT); Writeln(, or press q to end.); Repeat K:=GetKeyEvent; K:=TranslateKeyEvent(K); S:=GetKeyEventShiftState(K); If (S=0) then Writeln(No special keys pressed) else begin Writeln(Detected special keys : ,ShiftStateToString(K,False); Writeln(Got key : ,KeyEventToString(K); end; Until (GetKeyEventChar(K)=q); DoneKeyboard; end. 返回页首GetKeyEventUniCode定义:function GetKeyEventUniCode(KeyEvent: TKeyEvent): Word;描述:返回KeyEvent的unicode部分如果它包含一个翻译的unicode字符。 返回页首InitKeyBoard描述:procedure InitKeyboard;定义:初始化键盘驱动程序。如果驱动程序活跃,它就什么不做。驱动程序初始化后,它会做一切必要的事情来确保键盘的运作,包括分配内存、初始化终端等。这个过程应当被调用一次,在使用任何键盘过程和函数前。在他调用之后,donekeyboard也应当在退出程序或用setkeyboarddriver改变键盘驱动程序之前。 返回页首IsFunctionKey定义:function IsFunctionKey(KeyEvent: TKeyEvent): Boolean;描述:如果KeyEvent中的键盘事件是功能键则返回True,否则返回False。即功能键被按下就返回true,否则false。program example1; This program demonstrates the GetKeyEvent function uses keyboard; Var K : TKeyEvent; begin InitKeyBoard; Writeln(Press keys, press q to end.); Repeat K:=GetKeyEvent; K:=TranslateKeyEvent(K); If IsFunctionKey(K) then Writeln(Got function key : ,KeyEventToString(K) else Writeln(not a function key.); Until (GetKeyEventChar(K)=q); DoneKeyBoard; end. 返回页首KeyEventToString定义:Function KeyEventToString(KeyEvent : TKeyEvent) : String;描述:翻译KeyEvent中的键盘事件至一个人可读的按键描述。它会使用常量部分的常量来做。错误:如果按下一个未知的键,就返回扫描码(scancode),以SScanCode字符串为前缀。 返回页首PollKeyEvent定义:function PollKeyEvent: TKeyEvent;描述:检查是否有可见的键盘事件,如果找到就返回,如果没有就返回0.注:这并不从等待的(pending)键中移除这个键。,这个键依然可以被GetKeyEvent从等待的键盘事件的列表中检索。例子:program example4; This program demonstrates the PollKeyEvent function uses keyboard; Var K : TKeyEvent; begin InitKeyBoard; Writeln(Press keys, press q to end.); Repeat K:=PollKeyEvent; If k0 then begin K:=GetKeyEvent; K:=TranslateKeyEvent(K); writeln; Writeln(Got key : ,KeyEventToString(K); end else write(.); Until (GetKeyEventChar(K)=q); DoneKeyBoard; end. 返回页首PollShiftStateEvent定义:function PollShiftStateEvent: TKeyEvent;描述:返回当前键盘事件的shift状态。如果没有键盘事件在等待就返回0.例子:program example6; This program demonstrates the PollShiftStateEvent function uses keyboard; Var K : TKeyEvent; begin InitKeyBoard; Writeln(Press keys, press q to end.); Repeat K:=PollKeyEvent; If k0 then begin K:=PollShiftStateEvent; Writeln(Got shift state : ,ShiftStateToString(K,False); / Consume the key. K:=GetKeyEvent; K:=TranslateKeyEvent(K); end else write(.); Until (GetKeyEventChar(K)=q); DoneKeyBoard; end. 返回页首PutKeyEvent定义:procedure PutKeyEvent(KeyEvent: TKeyEvent);描述:添加KeyEvent直输入队列。根据实际这只能容纳一个值,即当调用这个过程多次时,只有最后一个被按下的键会被记住。例子:program example5; This program demonstrates the PutKeyEvent function uses keyboard; Var K,k2 : TKeyEvent; begin InitKeyBoard; Writeln(Press keys, press q to end.); K2:=0; Repeat K:=GetKeyEvent; If k0 then begin if (k2 mod 2)=0 then K2:=K+1 else K2:=0; K:=TranslateKeyEvent(K); Writeln(Got key : ,KeyEventToString(K); if (K20) then begin PutKeyEvent(k2); K2:=TranslateKeyEVent(K2); Writeln(Put key : ,KeyEventToString(K2) end end Until (GetKeyEventChar(K)=q); DoneKeyBoard; end. 返回页首SetKeyboardDriver定义:Function SetKeyboardDriver (Const Driver : TKeyboardDriver) : Boolean;描述:设置driver为键盘驱动程序,如果当前键盘驱动程序未被初始化。如果当前键盘驱动程序已被初始化,它就什么不做。在设置驱动程序之前,当前键盘驱动程序应通过调用DoneKeyboard来禁用。如果驱动程序被设置就返回true,没有就返回false。 返回页首ShiftStateToString定义:Function ShiftStateToString(KeyEvent : TKeyEvent; UseLeftRight : Boolean) : String;描述:返回keyEvent键盘事件的shift状态的字符串描述。它可以返回空字符串。Shift状态通过使用SShift常量中的字符串来描述。 返回页首TranslateKeyEvent定义:function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;描述:执行KeyEvent的AscII翻译。他将物理键转换为功能键如果这个键是功能键,并且将物理键转换成有序的AsCII字符如果有等效的字符键。 返回页首TranslateKeyEventUniCode定义:function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;描述:执行KeyEvent的Unicode翻译。并不是在所有平台上都能实现。错误:如果函数未实现,system单元的ErrorCode会被设为errKbdNotImplemented. 返回页首键盘扫描码(keyboard scan code)特殊的物理见用DOS下的扫描码编码在TkeyEvent类型的第二个字节。一个完整的扫描码列表如下,这是在默认的键盘事件转换机制中使用的键的列表。当写键盘驱动程序时,这些常量勇当通过个、不同的键盘事件函数返回,或TranslateKeyEvent钩应当被驱动程序实现。一下为结合shift、ctrl或alt的特殊键的扫描码。写一个键盘驱动程序(这里指的驱动程序和一般意义的应该不同)写一个键盘驱动程序意味着钩(hook)必须为大多数键盘单元的函数和过程创建。TKeyBoardDriver记录包含每一个可能的钩:TKeyboardDriver = Record InitDriver : Procedure; DoneDriver : Procedure; GetKeyEvent : Function : TKeyEvent; PollKeyEvent : Function : TKeyEvent; GetShiftState : Function : Byte; TranslateKeyEvent : Function (KeyEvent: TKeyEvent): TKeyEvent; TranslateKeyEventUniCode: Function (KeyEvent: TKeyEvent): TKeyEvent; end;TKeyboardDriver=RecordInitDriver:Procedure;DoneDriver:Procedure;GetKeyEvent:Function:TKeyEvent;PollKeyEvent:Function:TKeyEvent;GetShiftState:Function:Byte;TranslateKeyEvent:Function(KeyEvent:TKeyEvent):TKeyEvent;TranslateKeyEventUniCode:Function(KeyEvent:TKeyEvent):TKeyEvent;end;这些钩的解释如下:InitDriver初始化并使驱动程序可用。应当只被调用一次。应当初始化驱动程序所有需要的东西。DoneDriver禁用并清除驱动程序。应当在InitDriver后调用。应当清除InitDriver初始化的所有东西。GetKeyEvent必须等待并返回下一个键盘事件。不应当储存键。PollKeyEvent返回下一个键如果有。不应当储存键。GetShiftState返回当前的shift状态。TranslateKeyEvent将原始的键盘事件翻译成正确的键盘事件,及应当填充shift状态并将功能键扫描码转换成功能键键码。如果TranslateKeyEvent不被加入,默认的翻译函数会被调用,并将扫描码转换成正确的键盘事件。TranslateKeyEventUnicode将键盘事件翻译成unicode键的表示。严格的讲,只有GetKeyEvent和PollKeyEvent钩必须为驱动程序的函数正确的实现。一下单元演示了键盘驱动程序是怎样被安装的。它需要安装的键盘驱动程序,并钩住GetKeyEvent函数到寄存器,并登陆键盘事件到一个文件。这个驱动程序可以在其他任何驱动程序顶端工作,只要它在uses区域被引用并且在真正的驱动程序单元之后,并且真正的驱动程序单元应当设置驱动程序记录在他的初始化部分。例子:unit logkeys; interface Procedure StartKeyLogging; Procedure StopKeyLogging; Function IsKeyLogging : Boolean; Procedure SetKeyLogFileName(FileName : String); implementation uses sysutils,keyboard; var NewKeyBoardDriver, OldKeyBoardDriver : TKeyboardDriver; Active,Logging : Boolean; LogFileName : String; KeyLog : Text; Function TimeStamp : String; begin TimeStamp:=FormatDateTime(hh:nn:ss,Time(); end; Procedure StartKeyLogging; begin Logging:=True; Writeln(KeyLog,Start logging keystrokes at: ,TimeStamp); end; Procedure StopKeyLogging; begin Writeln(KeyLog,Stop logging keystrokes at: ,TimeStamp); Logging:=False; end; Function IsKeyLogging : Boolean; begin IsKeyLogging:=Logging; end; Function LogGetKeyEvent : TKeyEvent; Var K : TKeyEvent; begin K:=OldkeyboardDriver.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论