Как я могу получить глобальную горячую клавишу Win+*?

Я знаю, что уже есть много ресурсов о том, как захватить глобальную горячую клавишу с C# (используя Ctrl, Alt или что-то еще), но я не видел ни одного, который работал бы с клавишей Windows.

Можно ли захватить программу и ответить на глобальное сочетание клавиш Win+*? Например, показать форму, если пользователь нажимает Win+Z или что-то в этом роде.

2 ответа

Решение

Ключи Windows можно использовать как любой другой модификатор (const int MOD_WIN = 0x0008 в соответствии с MSDN). Я проверил это с RegisterHotKeyи работает нормально.

ОБНОВИТЬ

Пример кода, показывающий, как подключить различные комбинации клавиш, включая клавиши Windows, полагаясь на RegisterHotKey (LParam значения собраны вручную):

[System.Runtime.InteropServices.DllImport("User32")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[System.Runtime.InteropServices.DllImport("User32")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

public const int MOD_SHIFT = 0x4;
public const int MOD_CONTROL = 0x2;
public const int MOD_ALT = 0x1;
public const int WM_HOTKEY = 0x312;
public const int MOD_WIN = 0x0008;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_HOTKEY && m.WParam == (IntPtr)0)
    {
        IntPtr lParamWINZ = (IntPtr)5898248;
        IntPtr lParamWINCTRLA = (IntPtr)4259850;
        if (m.LParam == lParamWINZ)
        {
            MessageBox.Show("WIN+Z was pressed");
        }
        else if (m.LParam == lParamWINCTRLA)
        {
            MessageBox.Show("WIN+CTRL+A was pressed");
        }
    }
    base.WndProc(ref m);
}

private void Form1_Load(object sender, EventArgs e)
{
    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

    RegisterHotKey(this.Handle, 0, MOD_WIN, (int)Keys.Z);
    RegisterHotKey(this.Handle, 0, MOD_WIN + MOD_CONTROL, (int)Keys.A);
}

private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
    UnregisterHotKey(this.Handle, 0);
}

Хотя вышеупомянутое решение, кажется, работает для некоторых людей. Это не сработало для меня. Единственный способ заставить ключ WIN работать - отключить его в реестре.

https://msdn.microsoft.com/en-us/library/bb521407(v=winembedded.51).aspx

Недостаток: все горячие клавиши WIN отключены.

Есть два возможных способа сделать это в реестре:

(1) Общесистемный: (я не проверял этот) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ Раскладка клавиатуры, Имя: "Карта кодов сканирования", Тип: REG_BINARY (двоичное значение), Данные значения: "00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 5B E0 00 00 5C E0 00 00 00 00 "

(2) Для каждого пользователя: (это то, что я использовал) HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer, имя: "NoWinKeys", тип данных: REG_DWORD (значение DWORD), значение данных: 0, чтобы отключить ограничение или 1 для включения ограничения

Другие вопросы по тегам