В нескольких словах: блокирование Win после Win + Tab делает Windows, думаю Win по-прежнему вниз, так, то нажатие S с Win например, откроет очарование поиска, а не просто наберет «s» ... пока пользователь не нажмет . Выиграет. Not Блокировка означает, что появится меню «Пуск» Windows. Я в головоломке!Как подключить Win + Tab с помощью LowLevelKeyboardHook
У меня никаких проблем не закреплять в ярлыки с помощью Alt + Tab с помощью LowLevelKeyboardHook
или Win + Некоторые Ubounded Key с помощью RegisterHotKey
. Проблема возникает только с ключом Win с использованием LowLevelKeyboardHook
.
В приведенном ниже примере, я беру над Win вверх событие, когда Win + Вкладка комбинация обнаружена. Это приводит к тому, что все последующие нажатия клавиш ведут себя так, как будто клавиша 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 + Вкладка также будет принята.
Вот мои идеи, для которых я не смог найти документацию. Все могли бы успешно ответить на мой вопрос.
- Скажите Windows, чтобы «отменить» в Win без фактически вызывая его
- Предотвратить Windows, от запуска меню Пуск раз
- Hook непосредственно в Windows' Win + событие, а не вручную, зацепив в нажатия клавиша (Это было бы далеко моим первым выбором, если это существует)
Итак, короче: зацепите Win-ключ, вместо клавиши Win, и не мешайте другим нажатиям клавиш :) Я удалил' if (wParam == (IntPtr) WM_KEYDOWN) {return (IntPtr) 1; } 'и другой' return (IntPtr) 1; 'в блоке' if (keyInfo.VkCode == VK_LWIN) ', и это тоже сработало, хотя я считаю, что ваш код проще и чище. Я застрял в течение 9 месяцев на этом, так что сердечная благодарность за то, что нашли время, чтобы посмотреть на это! (И решение было простым, очевидно ...) –
Хмм, я не пробовал то, что вы предлагаете. Я подумал об этом, но предположил, что захват вниз будет мешать другим функциям подмигивания, вроде winkey + R. Подходит ли ваш подход к этому? – dss539
Да, да. Другими словами, я «записываю» Win Down вместо проверки состояния Win Down, когда происходит Tab Down. Это просто сделало код более трудным для чтения для такого же поведения, так что ... ваше лучше! –