Environment :
I am using VS2010 on Win10 x64 [16299.431].
I want to log some keys on my PC using SetWindowsHookEx function. 
Ultimate goal :
If someone type correct password in order, my PC will unlock automatically.  
Problem :
It doesn't work on SYSTEM authority.
Implementation:
#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);
}