在.NET中注册Hotkeys-三/四键的组合
-
13-10-2019 - |
题
我被困。
现在,我正在使用以下代码来收听Hotkeys:
[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);
它可以很好地工作。我的问题是如何将多个热键注册为相同的组合:
- A+B+C+D
- Alt+Shift+B
- Ctrl+Alt+Shift+X
编辑:我发现(就像Zooba所说的那样)如何“解密”哪个Hotkey被发送,这是解决方案:
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);
}
解决方案 2
我找到了答案。而不是使用 registerhotkey
, , 我用了 KeyState
它解决了我所有的问题。如果有人有兴趣,您可以 到这里 (backive.org上的备份)
其他提示
从文档 wm_hotkey:
lparam 低阶单词指定要与高阶Word指定的密钥一起按下的键,以生成WM_HOTKEY消息。这个词可以是以下值之一。高阶单词指定热键的虚拟密钥代码。
因此,您可以阅读 LParam
成员 m
要确定按下的键(或者,如果您分配了比较明智的标识符 GetHashCode
您可以检查 WParam
).
“高阶单词”和“低序单词”是指整数的一部分(实际上是一个 IntPtr
)包含 LParam
, ,因此您需要提取这些内容。低阶的单词是 i & 0xFFFF
, ,而高阶单词是 (i >> 16) & 0xFFFF
.
要检测按下哪个关键组合,请检查修饰符(Shift,Alt,Control)的低阶单词的最低四位,并将高阶单词与虚拟键代码进行比较 - 对于字母,该字母等于字符资本的价值(例如,A IS(int)'a'的虚拟密钥代码,而不是(int)'a')。
您的“ A+B+C+D'组合无效,因为 WM_HOTKEY
Hotkeys仅支持一个字符。您将需要附加一个键盘钩以检测到任何地方的组合(如果您只想在应用程序处于活动状态时要检测到消息)。
不隶属于 StackOverflow