В нескольких словах: блокировка Win вверх после Win + Tab заставляет Windows думать, что Win все еще нажата, поэтому нажатие S с помощью клавиши Win, например, откроет поиск а не просто набирать "s"... пока пользователь не нажмет Win снова. Не блокируя его, появляется меню "Пуск" Windows. Я в головоломке!
У меня нет проблем с подключением к ярлыкам с помощью Alt + Tab с помощью LowLevelKeyboardHook
или Win + Some Ubounded Key с помощью RegisterHotKey
. Проблема возникает только с помощью клавиши Win, используя LowLevelKeyboardHook
.
В приведенном ниже примере я принимаю событие Win up, когда обнаружена комбинация Win + Tab. Это приводит к тому, что все последующие нажатия клавиш ведут себя так, как будто клавиша Win все еще была нажата.
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode != HC_ACTION)
return CallNextHookEx(_hookID, nCode, wParam, lParam);
var keyInfo = (Kbdllhookstruct)Marshal.PtrToStructure(lParam, typeof(Kbdllhookstruct));
if (keyInfo.VkCode == VK_LWIN)
{
if (wParam == (IntPtr)WM_KEYDOWN) {
_isWinDown = true;
} else {
_isWinDown = false;
if (_isWinTabDetected) {
_isWinTabDetected = false;
return (IntPtr)1;
}
}
}
else if (keyInfo.VkCode == VK_TAB && _isWinDown) {
_isWinTabDetected = true;
if (wParam == (IntPtr)WM_KEYDOWN) {
return (IntPtr)1;
} else {
_isWinTabDetected = true;
Console.WriteLine("WIN + TAB Pressed");
return (IntPtr)1;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}
}
Здесь вы можете найти полный код (обратите внимание, что он должен заменить ваш Program.cs
в запущенном запущенном проекте WinForms): https://gist.github.com/christianrondeau/bdd03a3dc32a7a718d62 - нажмите Win + Tab, а заголовок Form
должен обновляться каждый раз при нажатии ярлыка.
Обратите внимание, что целью подключения к этой конкретной комбинации является предоставление альтернативы Alt + Tab без замены Alt + Tab. Также будет принят ответ, обеспечивающий возможность запуска пользовательского кода с помощью Win + Tab.
Вот мои идеи, для которых я не мог найти документацию. Все потенциально могли бы успешно ответить на мой вопрос.
- Скажите Windows, чтобы "отменить" Win вверх, фактически не вызывая его
- Предотвращение запуска Windows одним из меню "Пуск"
- Крюк непосредственно в событии Windows Win +, а не вручную подключаться к нажатиям клавиш (это было бы, безусловно, моим первым выбором, если это существует)