[EDIT 3] W pewnym sensie "rozwiązałem" go przy użyciu "dziwnej" wersji. Przynajmniej na najważniejsze klucze. Jest to wystarczające dla mojego przypadku, w którym chcę sprawdzić, czy ALT i ALT + A nie są takie same (tym samym upewniając się, że A nie jest wciśnięty). Nie idealne, ale już za dużo czasu na tak drobny problem. Dzięki za wszystkie odpowiedzi tak ... [EDIT 3]Wykryj, czy w C# zostanie naciśnięty dowolny klawisz (nie A, B, ale dowolny)
[EDIT 4] rozwiązać go znacznie czystsze dzięki 280Z28 [/ EDIT 4]
wiem jak sprawdzić klawiszy modyfikujących i jak przetestować pojedynczy klucz. Problem polega na tym, że chcę sprawdzić, czy naciśnięto jakiś klawisz. Poniższa metoda wydaje „dziwne” :-)
WPF aplikacja napisana w języku C#
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
wiem, że to jest enum, więc pomyślałem o pętli, ale to, co jest „największa liczba” używać. I czy to możliwe? Przy okazji, to jest bardzo szczególny przypadek, zwykle używałbym wydarzenia, ale w tym przypadku muszę to zrobić w ten sposób. Niestety, nie ma "listy" Keyboard.CurrentlyDownKeys. Przynajmniej nie widziałem tego.
Dzięki Chris
EDIT: Ok, ponieważ wydaje się być większa sprawa, tutaj powodem tego: I zdefiniowano "Keyset", który służy jako DictionaryKey dla funkcji niestandardowych. Jeśli ktokolwiek kliknie element, opakowanie przetwarza słownik i sprawdza, czy któryś z predefiniowanych "Zestawów klawiszy" jest aktywny.
To pozwala mi definiować proste wyzwalacze, np. Uruchom tę funkcję, jeśli naciśnięty zostanie ALT + A + B. Inną opcją jest np. Uruchom tę funkcję, jeśli naciśnięty zostanie ALT + STRG + A (podczas kliknięcia myszą elementu WPF).
Jedyny "problem" z bieżącą implementacją, jeśli zdefiniuję zestaw kluczy, który NIE zawiera żadnych kluczy REAL, np. Uruchom, gdy naciśnięty jest ALT, to jest również wyzwalany, gdy naciśnięty zostanie ALT + A. Och, pisząc to, zdaję sobie sprawę, że jest inny problem. ALT + A + B będzie również wyzwalać, jeśli naciśnięty zostanie ALT + A + B + C.
Być może moje podejście jest błędne i powinienem stworzyć "statyczny klucz do śledzenia" i porównać zestaw kluczy z jego wartościami (nabyte za pośrednictwem zdarzeń). Spróbuję.
EDIT 2 To nie działa, przynajmniej nie w prosty sposób. Potrzebuję FrameworkElement dołączyć do KeyDown, ale nie mam go w konstruktorze statycznym. I nie interesuje mnie KeyDownEvents jakiegoś elementu, ale "globalnie" ... Myślę, że zamierzam odłożyć ten problem, nie jest to aż tak ważne. Mimo to, jeśli ktoś wie lepiej od innego podejścia ...
Tak długo, dla każdego, kto dba, tu kod:
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;
}
}
Jaka jest twoja aplikacja? Konsola? Windows Forms? WPF? Stronie internetowej? – jrista
Zobacz nagłówek ... .NET C# –
To nie pomaga. –