把嘎嘎 2023-10-17 18:42 采纳率: 43.9%
浏览 8
已结题

windows hook win+L

在用键盘钩子勾win+l

LRESULT keyProc(int code, WPARAM wparam, LPARAM lparam)
{
  KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lparam;
  if (HC_ACTION == code)
  {
    if (0x4C == pkbhs->vkCode)//L键
   {
    //do something
    return 1;
    }
  }
  return CallNextHookEx(_keyHook, code, wparam, lparam);
}

SetWindowsHookExW(WH_KEYBOARD_LL, (HOOKPROC)&keyProc, GetModuleHandle(NULL), 0);

代码是这样写的,但是实际情况是电脑仍然响应了win+l 锁屏了,这是什么问题?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-17 20:11
    关注

    【以下回答由 GPT 生成】

    有一个问题导致你的代码无法阻止Win+L组合键的功能。在键盘钩子过程中,你需要处理特定的系统消息WM_SYSCOMMAND,以阻止锁屏操作。

    以下是修改后的代码示例,包含对WM_SYSCOMMAND消息的处理:

    LRESULT CALLBACK keyProc(int code, WPARAM wparam, LPARAM lparam)
    {
      if (HC_ACTION == code)
      {
        KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lparam;
        if (WM_SYSCOMMAND == wparam && SC_SCREENSAVE == pkbhs->wParam) // 锁屏消息
        {
          // 处理相关操作
          return 1;
        }
      }
      return CallNextHookEx(NULL, code, wparam, lparam);
    }
    

    在此示例中,我们将WM_SYSCOMMAND消息与SC_SCREENSAVE参数进行比较,以判断是否为锁屏消息。如果是锁屏消息,返回1来阻止锁屏操作。

    请注意,我将函数名更改为keyProc以匹配标准钩子过程的命名约定。此外,我将_keyHook更改为NULL,因为在此示例中我们使用的是全局钩子,而不是特定于线程的钩子。

    希望这能解决你的问题!如果还有更多疑问,请随时问我。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月16日
  • 创建了问题 10月17日