windows — Неожиданное поведение после перехвата клавиатуры в визуальном переполнении стека

Я работаю над проектом в Visual C ++ 2012 обновление 3. Мне нужно немного подключить клавиатуру и позволить пользователю вводить только пароль. Поэтому я отключаю все ключи, кроме тех, которые необходимы для ввода пароля. Это работает хорошо. Но после отсоединения клавиша alt нажимается автоматически. Я имею в виду после отсоединения, если я нажимаю клавишу табуляции, она работает так, как будто я нажал Alt + Tab. В windows 8 нажата клавиша win. Но как только я нажимаю клавишу Alt вручную на клавиатуре, проблема решается. Но это очень серьезный случай для меня, потому что пользователи наверняка теряют доверие к моему приложению из-за этого странного поведения. Может ли кто-нибудь, пожалуйста, помогите.

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{

if (nCode < 0 || nCode != HC_ACTION ) return CallNextHookEx( NULL, nCode, wParam, lParam);

KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;

if(
(p->vkCode == VK_BACK) ||
(p->vkCode == VK_SHIFT) ||
(p->vkCode == VK_CAPITAL) ||
(p->vkCode == VK_SPACE) ||
(p->vkCode == VK_HOME) ||
(p->vkCode == VK_END) ||
(p->vkCode == VK_LEFT) ||
(p->vkCode == VK_RIGHT) ||
(p->vkCode == VK_DELETE) ||
(p->vkCode >= 0x30 && p->vkCode <= 0x39) ||
(p->vkCode >= 0x41 && p->vkCode <= 0x5A) ||
(p->vkCode >= 0x60 && p->vkCode <= 0x6F) ||
(p->vkCode == 0x90) ||
(p->vkCode == 0x91) ||
(p->vkCode == 0xA0) ||
(p->vkCode == 0xA1) ||
(p->vkCode >= 0xBA && p->vkCode <= 0xC0) ||
(p->vkCode >= 0xDB && p->vkCode <= 0xDF) ||
(p->vkCode == 0xE2)
)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
else
return 1;
}

-1

Решение

Если клавиша alt нажата до того, как ваше приложение запускается, или удерживается, когда ваше приложение не может его перехватить (например, отправить в окно процесса, выполняемого от имени администратора), ваша ловушка будет съедать ключ для него и остальной системы. будет по-прежнему думать, что он нажимается, когда пользователь перестает его нажимать.

Вы могли бы использовать SendInput отправить ключ для него после того, как ваш хук сделан (или во время с фильтром для него, встроенным в ваш хук), но это не гарантирует, что окно, которое получило ключ, знает, что оно работает. Я не уверен там является особенно простое решение этой части.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]