[РЕДАКТИРОВАТЬ 3] Я как бы "решил это" при использовании "странной" версии. По крайней мере, для самых важных ключей. Это достаточно для моего случая, когда я хочу проверить, что ALT и ALT + A не совпадают (тем самым убедитесь, что A не нажата). Не идеальный, но уже много времени для такой крошечной проблемы. Спасибо всем за ответы! [РЕДАКТИРОВАТЬ 3]
[РЕДАКТИРОВАТЬ 4] Решила его намного чище благодаря 280Z28 [/EDIT 4]
Я знаю, как проверять ключи-модификаторы и как тестировать один ключ. Проблема в том, что я хочу проверить, нажата ли какая-либо клавиша. Следующий подход кажется "странным": -)
Приложение 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", который служит в качестве словаря для пользовательских функций. Если кто-либо нажимает на элемент, обертка выполняет итерацию через словарь и проверяет, активен ли какой-либо из предопределенных "Ключей".
Это позволяет мне определять простые триггеры, например, Запустите эту функцию, если нажать ALT + A + B. Другим вариантом является, например, Запустите эту функцию, если ALT + STRG + A нажата (во время щелчка мыши на элементе WPF).
Единственная "проблема" с текущей реализацией, если я определяю Keyset, который НЕ содержит никаких REAL-ключей, например run, если ALT нажат, он также запускается при нажатии ALT + A. О, когда я пишу это, я понимаю, что есть еще одна проблема. ALT + A + B также будет запускаться, если нажать ALT + A + B + C.
Возможно, мой подход ошибочен, и я должен создать "статический ключевой трекер" и сравнить набор ключей с его значениями (приобретенными через события). Я попробую попробовать.
РЕДАКТИРОВАТЬ 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;
}
}