【发布时间】:2010-12-17 16:08:47
【问题描述】:
[编辑 3] 我通过使用“奇怪”版本来“解决它”。至少对于最重要的键。这对于我的情况就足够了,我想检查 ALT 和 ALT+A 是否不同(从而确保没有按下 A)。不完美,但对于这样一个小问题已经有很多时间了。无论如何,感谢所有答案... [编辑 3]
[EDIT 4] 多亏了 280Z28 [/EDIT 4]
我知道如何检查修饰键以及如何测试单个键。 问题是,我想检查是否按下了任何键。以下方法似乎“奇怪”:-)
用 C# 编写的 WPF 应用程序
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
我知道它是一个枚举,所以我想到了一个循环,但是要使用的“最大数字”是多少。这可能吗?顺便说一句,这是一个非常特殊的情况,通常我会使用一个事件,但在这种情况下我必须这样做。不幸的是,没有“列表”Keyboard.CurrentlyDownKeys。至少我没看到。
谢谢, 克里斯
编辑:好的,因为这似乎是一个更大的交易,这里的原因是: 我已经定义了一个“KeySet”,它作为自定义函数的 DictionaryKey。如果有人点击一个元素,包装器会遍历字典并检查是否有任何预定义的“键集”处于活动状态。
这允许我定义简单的触发器,例如如果按下 ALT+A+B,则运行此函数。另一种选择是例如如果按下了 ALT+STRG+A(在鼠标单击 WPF 元素期间),则运行此函数。
当前实现的唯一“问题”是,如果我定义了一个不包含任何 REAL 键的键集,例如按下 ALT 时运行,如果按下 ALT+A 也会触发它。哦,写这个的时候,我意识到还有一个问题。如果按下 ALT+A+B+C,ALT+A+B 当前也会触发。
也许我的方法是错误的,我应该创建一个“静态密钥跟踪器”并将密钥集与其值(通过事件获取)进行比较。我会尝试一下。
编辑 2 这是行不通的,至少不是以简单的方式。我需要一个 FrameworkElement 来附加到 KeyDown,但我在静态构造函数中没有它。而且我对某个元素的 KeyDownEvents 不感兴趣,但是“全局”...我想我只是推迟了这个问题,它并不那么重要。不过,如果有人知道更好的不同方法......
这么久了,对于任何关心的人,这里有一些代码:
public class KeyModifierSet
{
internal readonly HashSet<Key> Keys = new HashSet<Key>();
internal readonly HashSet<ModifierKeys> MKeys = new HashSet<ModifierKeys>();
public override int GetHashCode()
{
int hash = Keys.Count + MKeys.Count;
foreach (var t in Keys)
{
hash *= 17;
hash = hash + t.GetHashCode();
}
foreach (var t in MKeys)
{
hash *= 19;
hash = hash + t.GetHashCode();
}
return hash;
}
public override bool Equals(object obj)
{
return Equals(obj as KeyModifierSet);
}
public bool Equals(KeyModifierSet other)
{
// Check for null
if (ReferenceEquals(other, null))
return false;
// Check for same reference
if (ReferenceEquals(this, other))
return true;
// Check for same Id and same Values
return Keys.SetEquals(other.Keys) && MKeys.SetEquals(other.MKeys);
}
public bool IsActive()
{
foreach (var k in Keys)
if (Keyboard.IsKeyUp(k)) return false;
if ((Keys.Count == 0) && !Keyboard.IsKeyDown(Key.None)) return false;
foreach (var k in MKeys)
if ((Keyboard.Modifiers & k) == 0) return false;
if ((MKeys.Count == 0) && Keyboard.Modifiers > 0) return false;
return true;
}
public KeyModifierSet(ModifierKeys mKey)
{
MKeys.Add(mKey);
}
public KeyModifierSet()
{
}
public KeyModifierSet(Key key)
{
Keys.Add(key);
}
public KeyModifierSet(Key key, ModifierKeys mKey)
{
Keys.Add(key);
MKeys.Add(mKey);
}
public KeyModifierSet Add(Key key)
{
Keys.Add(key);
return this;
}
public KeyModifierSet Add(ModifierKeys key)
{
MKeys.Add(key);
return this;
}
}
【问题讨论】:
-
你的申请是什么?安慰? Windows 窗体? WPF?网站?
-
看到这个问题:Capture KeyDown Event in WPF
-
是的,这使我的“静态密钥跟踪器”方法不太可行。至少对于像“在鼠标点击时跟踪键集”这样的“简单”事情来说,它似乎过于复杂。请参阅帖子中的edit2。
-
在 Post,WPF 应用程序中更正了它。抱歉,没有想到 winforms 和 WPF 之间的巨大差异。出于这个原因,我想避免使用事件(似乎冒泡、吃事件等过于复杂...... - 我知道它是如何完成的,但仍然......只想知道是否按下了任何字符键:-(
-
整个问题的所有不同编辑(按 3、4、1、2 的顺序)使得阅读它比应有的困难得多..