如何捕获全局Win + *热键?

时间:2013-11-19 21:13:10

标签: c# keyboard-shortcuts windows-key

我知道有很多关于如何使用C#捕获全局热键的资源(使用Ctrl,Alt或其他任何东西),但我还没有看到任何使用Windows键的工作。

是否可以捕获程序并响应Win + *全局键盘快捷键?例如,如果用户按 Win + Z 或类似的内容,则显示表单。

2 个答案:

答案 0 :(得分:1)

Windows键可以用作任何其他修饰符(根据MSDN const int MOD_WIN = 0x0008)。我已使用基于RegisterHotKey的代码对此进行了测试,并且运行正常。

更新

示例代码显示如何依靠RegisterHotKey(手动收集的LParam值)来挂钩不同的键组合,包括Windows键:

[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);
}

答案 1 :(得分:0)

即使上述解决方案似乎适用于某些人。它对我不起作用。获得WIN密钥的唯一方法是在注册表中禁用它。

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

缺点:所有WIN热键都被禁用。

在注册表中有两种可能的方法:

(1)全系统:(我没有测试过这个) HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Keyboard Layout, 名称:“扫描码地图”, 键入:REG_BINARY(二进制值), 价值数据:“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 \微软\的Windows \ CurrentVersion \政策\ Explorer中, 姓名:“NoWinKeys”, 数据类型:REG_DWORD(DWORD值), 值数据:0表示禁用限制,或1表示启用限制