[РЕДАКТИРОВАТЬ 3]
Я как бы «решил это», используя «странную» версию. По крайней мере, для самых важных ключей. Для моего случая этого достаточно, когда я хочу проверить, не совпадают ли ALT и ALT + A (тем самым убедившись, что A не нажата). Не идеально, но уже слишком много времени для такой крошечной проблемы. Спасибо за все ответы в любом случае ...
[ПРАВКА 3]
[ПРАВИТЬ 4] Решено намного чище благодаря 280Z28 [/ ПРАВИТЬ 4]
Я знаю, как проверить наличие клавиш-модификаторов и как проверить наличие одной клавиши.
Проблема в том, что я хочу проверить, нажата ли какая-либо клавиша. Следующий подход кажется «странным»: -)
Приложение WPF, написанное на C #
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
Я знаю, что это перечисление, поэтому я подумал о цикле, но какое «наибольшее число» использовать. И возможно ли это? Кстати, это особый случай, обычно я бы использовал событие, но в этом случае я должен сделать это таким образом. К сожалению, нет «списка» Keyboard.CurrentlyDownKeys. По крайней мере, я этого не видел.
Спасибо,
Chris
РЕДАКТИРОВАТЬ: Хорошо, потому что это, кажется, более крупная сделка, вот причина этого:
Я определил «KeySet», который служит DictionaryKey для пользовательских функций. Если кто-то нажимает на элемент, оболочка перебирает словарь и проверяет, активен ли какой-либо из предопределенных «Наборов ключей».
Это позволяет мне определять простые триггеры, например, например. Запустите эту функцию, если нажаты ALT + A + B. Другой вариант, например, Запустите эту функцию, если нажаты ALT + STRG + A (во время щелчка мышью на элементе WPF).
Единственная «проблема» с текущей реализацией, если я определяю набор ключей, который НЕ содержит никаких РЕАЛЬНЫХ клавиш, например, запускается, если нажата клавиша 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;
}
}