10

В нескольких словах: блокирование 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 + событие, а не вручную, зацепив в нажатия клавиша (Это было бы далеко моим первым выбором, если это существует)

ответ

2

Это, кажется, делает именно то, что вы хотите (опускает RWin, если вы хотите) ,

Пожалуйста, будьте внимательны и не регистрируйте этот крючок KB, когда ваше приложение теряет фокус!

[DllImport("user32.dll")] 
    static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); 

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode == HC_ACTION) 
     { 
      var keyInfo = (Kbdllhookstruct) Marshal.PtrToStructure(lParam, typeof (Kbdllhookstruct)); 
      if ((int) wParam == WM_KEYDOWN 
       && keyInfo.VkCode == VK_TAB 
       && (GetAsyncKeyState(Keys.LWin) < 0 || GetAsyncKeyState(Keys.RWin) < 0)) 
      { 
       _mainForm.Text = "Win + Tab was pressed " + (++_winTabPressCounter) + " times"; 
       return (IntPtr) 1; 
      } 
     } 

     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

Я пробовал несколько вещей, прежде чем открывать эту технику. Это сообщение было самым полезным https://stackoverflow.com/a/317550/55721

+0

Итак, короче: зацепите Win-ключ, вместо клавиши Win, и не мешайте другим нажатиям клавиш :) Я удалил' if (wParam == (IntPtr) WM_KEYDOWN) {return (IntPtr) 1; } 'и другой' return (IntPtr) 1; 'в блоке' if (keyInfo.VkCode == VK_LWIN) ', и это тоже сработало, хотя я считаю, что ваш код проще и чище. Я застрял в течение 9 месяцев на этом, так что сердечная благодарность за то, что нашли время, чтобы посмотреть на это! (И решение было простым, очевидно ...) –

+0

Хмм, я не пробовал то, что вы предлагаете. Я подумал об этом, но предположил, что захват вниз будет мешать другим функциям подмигивания, вроде winkey + R. Подходит ли ваш подход к этому? – dss539

+0

Да, да. Другими словами, я «записываю» Win Down вместо проверки состояния Win Down, когда происходит Tab Down. Это просто сделало код более трудным для чтения для такого же поведения, так что ... ваше лучше! –

4

системы должно знать, что вы Rele ase ключ Windows. проверить разницу между моим собственным крюком, который не имеет эту проблему и только diffence между вашим и шахтами эта линией:

if (_isWinTabDetected) { 
    _isWinTabDetected = false; 
    return (IntPtr)1; //THIS LINE 
} 
+0

Это решение не будет работать, потому что, когда Windows, получает Win без ярлыка, он запускает стартовое меню Windows. Единственная причина, по которой вы не видите этого в примере, - это то, что я использовал «MessageBox», и кажется, что «MessageBox» отменит меню Windows. Я изменю пример, чтобы написать что-то в 'Form1' вместо этого ... –

Смежные вопросы