c++ - SetWindowsHookEx 回调函数不适用于 SYSTEM 权限

标签 c++ winapi keyboard keyboard-hook authority

环境:
我在 Win10 x64 [16299.431] 上使用 VS2010。
我想使用 SetWindowsHookEx 函数在我的电脑上记录一些按键。

最终目标:
如果有人按顺序输入正确的密码,我的电脑将自动解锁。

问题:
它不适用于 SYSTEM 权限。

实现:

#define LOCK_ENABLE 0
#define LOCK_DISABLE 1

DWORD g_locker = LOCK_DISABLE;
DWORD g_selwrd = -2;
CHAR* g_szpaswd = "heaven";

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HOOKPROC LockerPraq();

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;

    if(HC_ACTION == nCode)
    {
        switch (wParam)
        {
        case WM_KEYDOWN:        case WM_SYSKEYDOWN:
            switch (p->vkCode)          {
            case VK_HOME:
                g_locker = LOCK_ENABLE;
                g_selwrd = -1;
                break;
            case VK_END:
                g_locker = LOCK_DISABLE;
                g_selwrd = 0;
                break;
            }

            if (LOCK_ENABLE == g_locker)
            {
                if (-1 == g_selwrd)
                    g_selwrd = 0;
                else
                {
                    CHAR szKbdstate[MAX_PATH] = {0};
                    WORD theChar = 0x0000;

                    ToAsciiEx(p->vkCode, p->scanCode, (BYTE*)szKbdstate, &theChar, 0, GetKeyboardLayout(0));
                    if (theChar != g_szpaswd[g_selwrd])
                        g_selwrd = 0;
                    else
                    {
                        g_selwrd++;
                        if (g_selwrd >= strlen(g_szpaswd))
                            UnLockPC();
                    }
                }
            }

            break;
        }

    }


    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

HOOKPROC LockerPraq()
{
    HHOOK hook_install = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);
    if (NULL == hook_install)
        return(0);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hook_install);

    return(0);
}

最佳答案

当 Windows 被锁定或注销时(如果这确实是您的问题)您看不到任何按键的原因是因为 Winlogon 在其自己的桌面上运行。

Winlogon 是处理登录和锁定屏幕的进程,它以一种安全的方式进行。微软没有很好地记录它,但有一篇文章 here大体上讨论了 session 和桌面,您可能会发现它们有帮助。

“SetWindowsHookEx”是 documented因为仅 Hook 与调用应用程序在同一桌面上运行的应用程序,所以这可能是您出现问题的原因。

我怀疑是否有办法解决这个问题。 Winlogon 在其自己的桌面上运行是有原因的,Microsoft 不希望您靠近它。

编辑:好吧,好吧,也许你可以把你自己的过程偷偷放进去,见:Running a process at the Windows 7 Welcome Screen

关于c++ - SetWindowsHookEx 回调函数不适用于 SYSTEM 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50499904/

相关文章:

c++ - 无法读取传递给顶点着色器的值

c++ - 我们需要为 gcnew 创建指针验证吗

c++ - 在源代码中使用环境变量(编译时)

c - Unix daemon() 子例程的 win32 替代方案是什么?

c++ - 模板类给出链接器错误

c++ - 是否可以启动命令行应用程序而不显示其窗口?

c++ - 定时器超时复位

Android 键盘将标签栏置于顶部

delphi - 不处理鼠标和键盘事件的表单

c# - TextBox 不会在空格键上触发 KeyDown 事件