gpt4 book ai didi

delphi - SetWindowsHookEx 卡住我的键盘和鼠标,并发生其他奇怪的事情

转载 作者:行者123 更新时间:2023-12-02 01:05:08 64 4
gpt4 key购买 nike

我正在Delphi中编写笑话程序(当用户使用鼠标或键盘时发出奇怪的声音),它使用全局钩子(Hook)来捕获鼠标和键盘事件。
这是负责处理这个钩子(Hook)的函数:

procedure MKHOOK(code: Integer;wp: wParam;lp: lParam); stdcall;
var
hh: HHOOK;
begin
PlaySound('fart.wav');
CallNextHookEx(hh,code,wp,lp);
end;

创建表单时 Hook 启动:

procedure TForm6.FormCreate(Sender: TObject);
begin
MH := SetWindowsHookEx(WH_MOUSE_LL,@MKHOOK,hInstance,0);
KH := SetWindowsHookEx(WH_KEYBOARD_LL,@MKHOOK,hInstance,0);
end;

其中 MH 和 KH 是 HHOOK 类型
当程序结束时,钩子(Hook)被删除:

procedure TForm6.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(MH);
UnhookWindowsHookEx(KH);
end;

问题开始了,当我尝试运行它时,发生了一些奇怪的事情,例如:

  • 鼠标和键盘停止工作,我必须使用 ctrl + alt + del 来恢复它
  • 程序执行后,当我停止程序时,某些键不起作用(ctrl、alt、tab)
  • 某些按键会改变其行为,例如,当我使用箭头键时,它们会改变我的屏幕 View 。

这段代码有什么问题?为什么它不起作用?抱歉我的英语不好;)

最佳答案

这里有一些问题。最明显的是:

  • 在 Hook 中调用 PlaySound 的成本太高。如果每次执行钩子(Hook)时都调用 PlaySound ,很可能会导致系统瘫痪。
  • 你的钩子(Hook)签名是错误的。它们必须是返回 LRESULT 的函数。文档中对这两种情况所需的返回值进行了如下描述:如果 nCode 小于零,则 Hook 过程必须返回 CallNextHookEx 返回的值。
  • 您不进行任何错误检查。始终检查 API 调用是否有错误。每个 API 调用的文档中讨论了错误处理。

CallNextHookEx 的第一个参数被忽略,因此您也可以传递 0。在我看来,使用单独的钩子(Hook)程序更干净。

Hook 函数必须如下所示:

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;

显然这些钩子(Hook)还没有做任何事情,但是让我们在尝试运行之前先走一下。

像这样安装钩子(Hook):

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

我认为很明显您没有足够详细地阅读文档。这些 API 使用起来很棘手。您的编码需要精确。我建议您更仔细地再次阅读文档。

关于delphi - SetWindowsHookEx 卡住我的键盘和鼠标,并发生其他奇怪的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33111774/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com