Функция обратного вызова SetWindowsHookEx не работает с полномочиями SYSTEM - PullRequest
0 голосов
/ 24 мая 2018

Среда:
Я использую VS2010 на Win10 x64 [16299.431].
Я хочу зарегистрировать некоторые ключи на моем ПК, используя функцию 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);
}

1 Ответ

0 голосов
/ 25 мая 2018

Причина, по которой вы не видите нажатий клавиш, когда Windows заблокирована или вышла из системы (если это действительно ваша проблема), заключается в том, что Winlogon работает на своем собственном рабочем столе.

Winlogon - это процесс, который обрабатывает экраны входа и блокировки и делает это безопасным способом.Это плохо документировано Microsoft, но есть статья здесь , в которой говорится о сессиях и рабочих столах в целом, что может оказаться полезным.

SetWindowsHookEx ' задокументировано кактолько перехват приложений, запущенных на том же рабочем столе, что и вызывающее приложение, так что это вероятная причина вашей проблемы.

Я сомневаюсь, что есть способ обойти это.Winlogon работает на своем собственном рабочем столе по какой-то причине, и Microsoft не хочет, чтобы вы были рядом с ним.

Редактировать: Хорошо, хорошо, возможно, вы можете прокрутить свой собственный процесс, см .: Запуск процесса на экране приветствия Windows 7

...