【问题标题】:SetWindowsHookEx - cancel Winkey + L (pc lock)SetWindowsHookEx - 取消 Winkey + L(电脑锁)
【发布时间】:2020-01-19 06:42:13
【问题描述】:

使用 SetWindowsHookEx 捕捉键盘事件

SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)

使用此代码尝试防止电脑锁定

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
        {
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            // Winkey or l
            if (kbdStruct.vkCode == VK_LWIN || kbdStruct.vkCode == 0x4C)
                return 1;
        }
    }
    return CallNextHookEx(_hook, nCode, wParam, lParam);
}

看起来“l”按钮被取消了:例如,不能在记事本中使用“l”。但是电脑仍然锁定是按Winkey + l。

【问题讨论】:

  • 像 CTRL+ALT+DEL 一样,我 99% 确定这是一个操作系统级别的挂钩,出于安全目的控制 WIN+L
  • 有什么解决办法吗?
  • 你真正想做什么?
  • 我有一个带有 F1-F12 按钮的蓝牙键盘,映射了音量、媒体播放器等特定功能。我需要 F1-F12 有标准功能。我创建了切换键盘代码的实用程序。除了 F12 外一切正常 - 键盘发送 WinKey+L。我无法改变这一点。

标签: c windows winapi


【解决方案1】:

正如@selbie 所说,出于安全目的,您不会挂钩控件WIN+L

但是如果你想用F12键盘发送WinKey+L,我建议你改用LockWorkStation()函数。

锁定工作站的显示。锁定工作站可以保护它 防止未经授权的使用。

最少的代码:

if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT *kbdStruct = (KBDLLHOOKSTRUCT*)lParam;
        if (wParam == WM_KEYDOWN)
        {
            printf("%ld is down\n", kbdStruct->vkCode);
            switch (kbdStruct->vkCode)
            {
            case VK_F12:
                LockWorkStation();
                break;
            }

        }
    }

另外,我注意到您之前的帖子是关于非标准键盘的虚拟键的。如果检测不到VK_F12,可以使用@Remy method

【讨论】:

  • @user1167761 你好,这个答案对你有用吗?
猜你喜欢
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多