请问我想HOOK已知handle的回车事件,只能是定时检测键盘有没有敲回车?(100分)

  • 主题发起人 主题发起人 jxzqsun
  • 开始时间 开始时间
J

jxzqsun

Unregistered / Unconfirmed
GUEST, unregistred user!
请问我想HOOK已知handle的回车事件,只能是定时检测键盘有没有敲回车?
我能不能不用定时器,而是直接在那个程序回车事件发生后,我的程序就知道?

谢谢各位了!搞的好辛苦哦,呵呵,现在都凌晨3点了。5、1没地方去,人太多了,不如玩玩这个,上班了又没时间。
 
就是键盘钩子么!http://www.2ccc.com/article.asp?articleid=942
 
能,给你个键盘勾子
library Key;

uses
SysUtils,Classes,windows,messages,HookKey_Unit in '../DH/HookKey_Unit.pas';

{$R *.RES}
exports
HookOn,
HookOff;

begin
end.

unit HookKey_Unit;

interface
uses windows,messages;
const
WM_HOOKKEY = WM_USER + $1000;
procedure HookOn; stdcall;
procedure HookOff; stdcall;
implementation
var
HookDeTeclado : HHook;
FileMapHandle : THandle;
PViewInteger : ^Integer;

function CallBackDelHook( Code : Integer;
wParam : WPARAM;
lParam : LPARAM
) : LRESULT; stdcall;

begin
if code=HC_ACTION then
begin
FileMapHandle:=OpenFileMapping(FILE_MAP_READ,False,'KeyHook');
if FileMapHandle<>0 then
begin
PViewInteger:=MapViewOfFile(FileMapHandle,FILE_MAP_READ,0,0,0);
PostMessage(PViewInteger^,WM_HOOKKEY,wParam,lParam);
UnmapViewOfFile(PViewInteger);
CloseHandle(FileMapHandle);
end;
end;
Result := CallNextHookEx(HookDeTeclado, Code, wParam, lParam)
end;

procedure HookOn; stdcall;
begin
HookDeTeclado:=SetWindowsHookEx(WH_KEYBOARD, CallBackDelHook, HInstance , 0);
end;

procedure HookOff; stdcall;
begin
UnhookWindowsHookEx(HookDeTeclado);
end;
end.

unit TestHookKey_Unit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
WM_HOOKKEY= WM_USER + $1000;
HookDLL = 'Key.dll';
type
THookProcedure=procedure; stdcall;
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FileMapHandle : THandle;
PMem : ^Integer;
HandleDLL : THandle;
HookOn,
HookOff : THookProcedure;
procedure HookKey(var message: TMessage); message WM_HOOKKEY;

public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
HandleDLL:=LoadLibrary( PChar(ExtractFilePath(Application.Exename)+
HookDll) );
if HandleDLL = 0 then raise Exception.Create('未发现键盘钩子DLL');
@HookOn :=GetProcAddress(HandleDLL, 'HookOn');
@HookOff:=GetProcAddress(HandleDLL, 'HookOff');
IF not assigned(HookOn) or
not assigned(HookOff) then
raise Exception.Create('在给定的 DLL中'+#13+
'未发现所需的函数');

FileMapHandle:=CreateFileMapping( $FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(Integer),
'TestHook');

if FileMapHandle=0 then
raise Exception.Create( '创建内存映射文件时出错');
PMem:=MapViewOfFile(FileMapHandle,FILE_MAP_WRITE,0,0,0);
PMem^:=Handle;
HookOn; //装入勾子
end;

//处理按鍵消息
procedure TForm1.HookKey(var message: TMessage);
var
KeyName : array[0..100] of char;
Accion : string;
begin
GetKeyNameText(Message.LParam,@KeyName,100);
if string(KeyName)='enter' then
begin
//你想做的事情
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(HookOff) then
HookOff;
if HandleDLL<>0 then
FreeLibrary(HandleDLL);
if FileMapHandle<>0 then
begin
UnmapViewOfFile(PMem);
CloseHandle(FileMapHandle);
end;
end;
end.

其实只监视一个键,还是用计时器好,代码也短得多
简单点在计时器里用个GetAsyncKeyState就行了
 
钩子代码到处都是,拜托不要再贴拉!!
 
to 楼主: 问问题之前,到全文检索去看看吧。 http://richsearch.com/index.html
 
谢谢两位指导,我是想只得到我指定的HANDLE的回车事件,或者ONFOCUS事件,不是监控所有键盘事件,能不能给个DEMO?

域:您给的例子能编译,但是怎么没反应呢?

刘浏:我是先搜索,然后实在没找到适合我要求的答案,所以才提问的,呵呵。不好意思
 
其实说白了,我不是想钩键盘,我是想钩事件,比如说ONCLICK,ONKEYPRESS。呵呵

是钩指定HANDLE的EDIT事件。
 
上面的代码我测试过可行的
你指的没反应是哪没反应?
会不会是:
procedure TForm1.HookKey(var message: TMessage);
var
KeyName : array[0..100] of char;
Accion : string;
begin
GetKeyNameText(Message.LParam,@KeyName,100);
if uppercase(string(KeyName))='ENTER' then //改改这里
begin
//你想做的事情
end;
end;
另外,如果只想监视某一个程序的按键,可以等发现handle后再装勾子
来自:jxzqsun, 时间:2004-5-4 20:45:21, ID:2593861
其实说白了,我不是想钩键盘,我是想钩事件,比如说ONCLICK,ONKEYPRESS。呵呵

是钩指定HANDLE的EDIT事件。

我想,是否可以这样?
先获得你要监视的exit类的句柄(这个可以先找主程序handle,再枚举子窗口来找类名和handle),然后监视键盘,有输入时用GetWindowText取出exit中的内容和按下键比较,看是否在是在指定的exit中输入,如果是,则开始监视回车键....

 
谢谢域,我改了,还是没反应,奇怪。

另外,先获得你要监视的exit类的句柄(这个可以先找主程序handle,再枚举子窗口来找类
名和handle),然后监视键盘,有输入时用GetWindowText取出exit中的内容和按下键比
较,看是否在是在指定的exit中输入,如果是,则开始监视回车键....
能否给个DEMO,呵呵,谢谢了
 
没反应就是说程序运行了,但是
//你想做的事情
里面的代码showmessage()没有执行。
 
用WH_CALLWNDPROC钩子就可以,在消息发送给目标窗体之前将其截取,
该钩子函数的回调函数形式为 CallWndProcnCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;
其中 lParam 是 TCWPStruct 结构 里面就有目标句柄。。。。。。
 
谢谢刘麻子,能给个demo吗?我现在能钩键盘了,但是不知道怎么钩消息,我写的程序经常让我系统僵死,呵呵。
 
OK,我提供思路吧?在挂钩子之前,先创建一个内存映射文件,这个相当于整个系统所有的
进程可以共享的内存变量,然后把要扑捉的窗体的句柄写进去,然后挂钩子,需要注意的,
在dll初始化代码里面写,打开内存隐射文件的代码,之后才能访问到,好,然后........
if TCWPStruct^(lParam).hwnd = 句柄 then .... 仅仅是思路,没有测试。。仅供参考。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
676
import
I
后退
顶部