键盘钩子(HOOK),以前的帖子太多了,去翻一下吧。
解决方案 »
- 散分,另外欢迎访问我的软件开发文档网 http://www.kfdoc.com
- 关于删除文件的问题!
- 欲做兼职,有意者请与我联系~~
- 如何在Delphi里删除文件夹?
- 控件问题
- 求救,是不是delphi 的数据库也会崩溃?
- 用ADO控件经常弹出一个Database Login对话框,有什么方法可以把这个对话框去掉?
- Delphi编译出来的文件太大了,有办法减小吗?
- 无偿奉献!一年的作品Delphi源码(人力资源管理,动态IP转换,同学录,远程桌面监控)
- 两个问题,IDispatch什么意思?顺便帮我看看下面这段话。。。。
- 如何生成多个同一线程的实例?
- 100分求SQLConfigDataSource函数的实例
[email protected]
Hook程序一般分两部份,Hook是一个dll,app负责调用和解除Hook.
下面是一个拦截VK_Escape的unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;{按键消息的结构,Delphi中也没有,自己定义吧。这也就我为什么说用C写
这样的程序更好的原因之一。还必须注意的是这个结构在Windows NT 4 sp3以上系统
中才能使用}
tagKBDLLHOOKSTRUCT = packed record
vkCode: DWORD;//虚拟键值
scanCode: DWORD;//扫描码值(没有用过,我也不懂^_^)
{一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
flags: DWORD;
time: DWORD;//消息时间戳
dwExtraInfo: DWORD;//和消息相关的扩展信息
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
const WH_KEYBOARD_LL = 13;
//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
const LLKHF_ALTDOWN = $20;var
Form1: TForm1;
hhkLowLevelKybd: HHOOK;
implementation
{
功能:低级键盘钩子的回调函数,在里面过滤消息
参数:nCode 是Hook的标志
WParam 表示消息的类型
LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
}
function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
var
fEatKeystroke: BOOL;
p: PKBDLLHOOKSTRUCT;
begin
Result := 0;
fEatKeystroke := FALSE;
p := PKBDLLHOOKSTRUCT (lParam);
//nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
if (nCode = HC_ACTION) then
begin
//拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
case wParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
fEatKeystroke :=
(p.vkCode = vk_escape);
if fEatKeystroke then
begin
//dosomething
end;
end;
end;
end; if fEatKeystroke = True then
Result := 1;
if nCode <> 0 then
Result := CallNextHookEx(0, nCode, wParam, lParam);end;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
//设置低级键盘钩子
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
LowLevelKeyboardProc, Hinstance, 0);
if hhkLowLevelKybd <> 0 then
MessageBox(0, '低级键盘钩子设置成功!', '提示', MB_OK);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//卸载低级键盘钩子
if hhkLowLevelKybd <> 0 then
begin
UnhookWindowsHookEx(hhkLowLevelKybd);
MessageBox(0, '低级键盘钩子卸载成功!', '提示', MB_OK);
end;
end;end.