delphi键盘钩子没效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi键盘钩子没效果相关的知识,希望对你有一定的参考价值。

按照网上给出的那个键盘鼠标记录回放的代码,点击记录后在edit1里输入,然后点回放,没见到什么反应,还有edit1有什么作用,键盘钩子要怎么触发?hhook:=setwindowshookex就触发这个钩子吗 ?触发后会一直在运行吗?求大神指导,解决会加分的
解决了,不是代码的问题,是win7用不了

参考技术A unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
Private declarations
public
Public declarations
end;
var
Form1: TForm1;
EventArr:array[0..1000]of EVENTMSG;
EventLog:Integer;
PlayLog:Integer;
hHook,hPlay:Integer;
bDelay:Bool;
implementation
$R *.DFM
Function PlayProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
begin
Result:=0;
if iCode < 0 then
Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
else if iCode = HC_SYSMODALON then
// canPlay:=0
else if iCode = HC_SYSMODALOFF then
// canPlay:=1
else if (iCode=HC_GETNEXT) then begin
if bDelay then begin
bDelay:=False;
Result:=50;
end;
pEventMSG(lParam)^:=EventArr[PlayLog];
end
else if (iCode = HC_SKIP)then begin
bDelay := True;
PlayLog:=PlayLog+1;
end;
if PlayLog>=EventLog then begin
UNHookWindowsHookEx(hPlay);
end;
end;
function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
begin
// recOK:=1;
Result:=0;
if iCode < 0 then
Result := CallNextHookEx(hHook,iCode,wParam,lParam)
else if iCode = HC_SYSMODALON then
// recOK:=0
else if iCode = HC_SYSMODALOFF then
// recOK:=1
else if (iCode = HC_ACTION) then begin
EventArr[EventLog]:=pEventMSG(lParam)^;
EventLog:=EventLog+1;
if EventLog>=1000 then begin
UnHookWindowsHookEx(hHook);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled:=False;
Button3.Enabled:=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EventLog:=0;
hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
Button2.Enabled:=True;
Button1.Enabled:=False;
Button3.Enabled:=False;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
PlayLog:=0;
hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,
HInstance,0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(hHook);
hHook:=0;
Button1.Enabled:=True;
Button2.Enabled:=False;
Button3.Enabled:=True;
end;
end.

以上是delphi核心编程里 钩子原理:鼠标键盘记录与回放中的代码,一个form,三个按钮
参考技术B 贴你的代码出来本回答被提问者采纳

delphi 键盘全局钩子

function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if (wParam = VK_CONTROL) then
begin
//代码........
end;
Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

-------------------------------
hook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
//建立

钩子的代码就是这么写的,为什么做出来以后,只能勾自己的EXE不能勾全局的?

不是不给分,采纳就加分。
回复 warmwormn :

我是放到DLL里面的

回复 yangyxd:

WH_KEYBOARD_LL, 这个是在哪里啊? 不在windows 里面哦。
我 Const 它 =13 以后, 更勾不上了……

参考技术A WH_KEYBOARD 对于全局的效果不好用, 换用 WH_KEYBOARD_LL 钩子吧。

示例代码:

//全局键盘钩子消息处理函数
function KeyHookProc(nCode:Integer; wP:WPARAM; lP:LPARAM):LRESULT; stdcall;
var
pEvt: TEventMsg;
vKey: Cardinal;
begin
if (nCode = HC_ACTION) then begin
vKey := 0;
case wP of
WM_SYSKEYDOWN, WM_KEYDOWN:
begin
pEvt := PEventMsg(LP)^;
vKey := LOBYTE(pEvt.message);
case vKey of
......
end;
end;
end;

WM_SYSKEYUP, WM_KEYUP:;
end;
end;
result := CallNextHookEx(hKeyHook, nCode, wP, lP);
end;

安装钩子:
hKeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyHookProc, hInstance, 0);本回答被提问者采纳
参考技术B 正常,全局钩子啊
不是运行在你的程序里的
要进行代码注入

所以全局钩子一定要放在动态库里
然后由你的程序把这个动态库调用进行
再然后,系统会把这个动态库注入到别的程序里
再再然后,别的程序会在键盘操作时调用到这个动态库
再再再然后,你的动态库要把别的程序的操作回发到你的程序里来
再再再再然后,你的程序就可以收到操作了

注意:这个动态库操作的全部是系统全局变量,所有本程序里的变量
如HWND等等都是不能直接操作的

以上是关于delphi键盘钩子没效果的主要内容,如果未能解决你的问题,请参考以下文章

DELPHI中的钩子是啥?

我在VC++中写了键盘勾子程序,但当我把鼠标点到任务栏后,钩子程序就失去效果。请问啥原因呢?有啥解决

键盘钩子怎么 使用

c++实现键盘记录仪(键盘钩子)

C# WinForm键盘钩子

键盘钩子失灵