我在Delphi中编写笑话程序(发出奇怪的声音,用户使用鼠标或键盘),它使用全局钩子捕获鼠标和键盘事件.
这是负责处理这个钩子的函数:
procedure MKHOOK(code: Integer;wp: wParam;lp: lParam); stdcall;
var
hh: HHOOK;
begin
PlaySound('fart.wav');
CallNextHookEx(hh,code,wp,lp);
end;
Run Code Online (Sandbox Code Playgroud)
当Form创建时,Hook开始:
procedure TForm6.FormCreate(Sender: TObject);
begin
MH := SetWindowsHookEx(WH_MOUSE_LL,@MKHOOK,hInstance,0);
KH := SetWindowsHookEx(WH_KEYBOARD_LL,@MKHOOK,hInstance,0);
end;
Run Code Online (Sandbox Code Playgroud)
当程序结束时,MH和KH是HHOOK Hook的类型被删除的地方:
procedure TForm6.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(MH);
UnhookWindowsHookEx(KH);
end;
Run Code Online (Sandbox Code Playgroud)
问题开始,当我尝试运行它时会发生奇怪的事情:
这段代码有什么问题?为什么它不起作用?对不起我的英语不好 ;)
这里有一些问题.最明显的:
PlaySound太贵了.如果你PlaySound每次执行钩子都会打电话,它可能会使系统陷入困境.LRESULT.在两种情况下,文档中描述了所需的返回值,如下所示:如果nCode小于零,则挂钩过程必须返回CallNextHookEx返回的值.第一个参数CallNextHookEx被忽略,所以你也可以通过0.在我看来,使用单独的钩子程序更清晰.
钩子函数必须如下所示:
function MouseHook(code: Integer; wp: wParam; lp: lParam): LRESULT; stdcall;
begin
Result := CallNextHookEx(0, code, wp, lp);
end;
function KeyboardHook(code: Integer; wp: wParam; lp: lParam): LRESULT; stdcall;
begin
Result := CallNextHookEx(0, code, wp, lp);
end;
Run Code Online (Sandbox Code Playgroud)
显然这些钩子还没有做任何事情,但是在我们尝试运行之前让我们走一走.
安装这样的钩子:
MH := SetWindowsHookEx(WH_MOUSE_LL, @MouseHook, hInstance, 0);
if MH = 0 then
// handle error
KH := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, hInstance, 0);
if KH = 0 then
// handle error
Run Code Online (Sandbox Code Playgroud)
我认为很明显你没有详细阅读文档.这些API使用起来很棘手.您需要精确编码.我建议您再次仔细阅读文档.
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |