如何处理可自定义热键设置?
本文关键字:自定义 设置 何处理 处理 | 更新日期: 2023-09-27 18:08:42
我试图让我的应用程序的用户选择为某些功能设置键盘热键。
现在我使用TextBox
与KeyDown
事件如下:
Key Hotkey;
private void SetHotKey(object sender, KeyEventArgs e)
{
(sender as TextBox).Text = e.Key.ToString();
Hotkey = e.Key;
e.Handled = true;
}
这种方法的问题是我不能设置复杂的快捷键,如[Ctrl]+[F4]。是否有一些第三方控制来帮助解决这个问题?还是更适合在文本框上订阅的事件?
更新:我已经改变了我的代码,但似乎我仍然做错了。
Key Hotkey;
bool lControl = false;
bool lAlt = false;
bool lShift = false;
private void SetHotKey(object sender, KeyEventArgs e)
{
var k = e.Key;
if (e.IsDown)
{
var tb = sender as TextBox;
tb.Text = "";
lControl = Keyboard.IsKeyDown(Key.LeftCtrl);
lAlt = Keyboard.IsKeyDown(Key.LeftAlt);
lShift = Keyboard.IsKeyDown(Key.LeftShift);
if (lControl) tb.Text += "Ctrl+";
if (lAlt) tb.Text += "Alt+";
if (lShift) tb.Text += "Shift+";
tb.Text = e.Key.ToString();
Hotkey = e.Key;
}
e.Handled = true;
}
我怎样才能使它工作和看起来更干净?
让你从正确的方向开始。
首先,您需要System/ImeProcessed/DeadCharProcessed键后面的真实密钥。这可以通过扩展方法来实现,以便于访问。
public static Key RealKey(this KeyEventArgs e)
{
switch (e.Key)
{
case Key.System:
return e.SystemKey;
case Key.ImeProcessed:
return e.ImeProcessedKey;
case Key.DeadCharProcessed:
return e.DeadCharProcessedKey;
default:
return e.Key;
}
}
然后你应该将你的修饰符格式化为快捷键,而不仅仅是按下的键。你可以使用键盘。ModifierKeys用于获取标志和更容易格式化,将它们收集在一个列表中。而且你应该阻止修改键(Ctrl, Alt和Shift)更新热键。
private void SetHotKey(object sender, KeyEventArgs e)
{
var nonShortcuttableKeys = new[] { Key.LeftAlt, Key.RightAlt, Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift };
var actualKey = e.RealKey();
if (e.IsDown && !nonShortcuttableKeys.Contains(actualKey))
{
var tb = sender as TextBox;
var modifiers = new List<ModifierKeys>();
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
{
modifiers.Add(ModifierKeys.Control);
}
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
{
modifiers.Add(ModifierKeys.Alt);
}
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
{
modifiers.Add(ModifierKeys.Shift);
}
tb.Text = modifiers.Count == 0
? string.Format("{0}", actualKey)
: string.Format("{0} + {1}", string.Join(" + ", modifiers), actualKey);
Hotkey = actualKey;
}
e.Handled = true;
}
WinForms你可以检查KeyEventArgs。如果按下Ctrl或未按下,则修改符。https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.modifiers (v = vs.110) . aspx
WPF你可以使用这个小代码片段来检查是否按下了Control键:
Keyboard.IsKeyDown(Key.LeftCtrl)
如果你想使用MVVM模式,你可以使用文本框(或任何其他控件)的KeyBindings在WPF中创建键绑定