gpt4 book ai didi

c# - 在 .NET 中注册热键 - 三/四键组合

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:49 27 4
gpt4 key购买 nike

我卡住了。

现在,我正在使用以下代码来监听热键:

    [DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd,
int id, int fsModifiers, int vlc);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
// whatever i need
}
base.WndProc(ref m);
}

以及注册热键的函数:

Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr);

它完美地工作。我的问题是如何将多个热键注册为相同的组合,例如:

  1. A+B+C+D
  2. Alt+Shift+B
  3. CTRL+ALT+SHIFT+X

编辑:我发现(如 Zooba 所说)如何“解密”发送了哪个热键,这是解决方案:

    protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);
if ((modifier + "+" + key == "Alt+S"))
{
//do what ever I need.
}
}
base.WndProc(ref m);
}

最佳答案

来自 WM_HOTKEY 的文档:

lParam The low-order word specifies the keys that were to be pressed in combination with the key specified by the high-order word to generate the WM_HOTKEY message. This word can be one or more of the following values. The high-order word specifies the virtual key code of the hot key.

因此您可以读取 mLParam 成员以确定按下的键(或者,如果您分配比 GetHashCode 更明智的标识符> 你可以检查 WParam)。

'high-order word'和'low-order word'指的是包含在LParam中的整数部分(实际上是一个IntPtr),所以你需要提取这些。低位词是i & 0xFFFF,而高位词是(i >> 16) & 0xFFFF

要检测按下的是哪个组合键,请检查修饰符(shift、alt、control)的低位字的最低四位,并将高位字与虚拟键码进行比较——对于字母来说,它是相等的到大写的字符值(例如,A 的虚拟键码是 (int)'A',而不是 (int)'a')。

您的“A+B+C+D”组合无效,因为 WM_HOTKEY 热键仅支持单个字符。您将需要附加一个键盘钩子(Hook)以从任何地方检测该组合(或者如果您只想在应用程序处于事件状态时检测它,则处理消息)。

关于c# - 在 .NET 中注册热键 - 三/四键组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com