gpt4 book ai didi

c# - 如何处理可自定义的热键设置?

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:18 25 4
gpt4 key购买 nike

我试图让我的应用程序的用户可以选择为某些功能设置键盘热键。

现在我正在使用 TextBoxKeyDown 事件,如下所示:

Key Hotkey;
private void SetHotKey(object sender, KeyEventArgs e)
{
(sender as TextBox).Text = e.Key.ToString();
Hotkey = e.Key;
e.Handled = true;
}

这种方法的问题是我无法设置复杂的快捷方式,例如 [Ctrl]+[F4]。是否有一些第 3 方控件可以帮助解决这个问题?或者更适合在文本框上订阅的事件?

更新:我已经更改了我的代码,但似乎我仍然做错了什么。

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 key 背后的真实 key 。这可以通过扩展方法来完成,以便于访问。

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

然后您应该将修饰符格式化为快捷方式,而不仅仅是按下的键。您可以使用 Keyboard.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;
}

关于c# - 如何处理可自定义的热键设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39696219/

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