Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SetWindowsHookEx回调函数在系统权限上不起作用_C++_Winapi_Keyboard_Keyboard Hook_Authority - Fatal编程技术网

C++ SetWindowsHookEx回调函数在系统权限上不起作用

C++ SetWindowsHookEx回调函数在系统权限上不起作用,c++,winapi,keyboard,keyboard-hook,authority,C++,Winapi,Keyboard,Keyboard Hook,Authority,环境: 我正在Win10 x64[16299.431]上使用VS2010。 我想使用SetWindowsHookEx功能在电脑上记录一些按键 最终目标: 如果有人按顺序键入正确的密码,我的电脑将自动解锁 问题: 它不适用于系统权限 实施: #define LOCK_ENABLE 0 #define LOCK_DISABLE 1 DWORD g_locker = LOCK_DISABLE; DWORD g_selwrd = -2; CHAR* g_szpaswd = "heaven"; LRE

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

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

问题:
它不适用于
系统
权限

实施:

#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是一个处理登录和锁定屏幕的过程,它以一种安全的方式进行处理。微软并没有很好的文档记录,但有一篇文章讨论了会话和台式机,您可能会觉得这很有帮助

“SetWindowsHookEx”只是挂接与调用应用程序在同一桌面上运行的应用程序,因此这可能是问题的原因

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

编辑:好吧,也许你可以把你自己的过程偷偷放在那里,请看:

(也请看。我们有投票权并接受。)