[EDIT 3] je sorte de « résolu » par à l'aide de la version « étrange ». Au moins pour les clés les plus importantes. C'est suffisant pour mon cas, où je veux vérifier que ALT et ALT + A ne sont pas les mêmes (en s'assurant que A n'est pas enfoncé). Pas parfait, mais déjà beaucoup de temps pour un si petit problème. Merci pour toutes les réponses de toute façon ... [EDIT 3]détecter si une touche est enfoncée en C# (non A, B, mais tout)
[EDIT 4] a résolu le problème beaucoup plus propre grâce à 280Z28 [/ EDIT 4]
Je sais comment vérifier les touches de modification et comment pour tester une seule clé. Le problème est, je veux vérifier si une touche est pressée. L'approche suivante semble « étrange » :-)
WPF application écrite en C#
if (Keyboard.IsKeyDown(Key.A)) return true;
if (Keyboard.IsKeyDown(Key.B)) return true;
if (Keyboard.IsKeyDown(Key.C)) return true;
Je sais qu'il est un ENUM, donc je pensais à une boucle, mais ce qui est le « plus grand nombre » utiliser. Et est-ce possible? btw, c'est un cas très spécial, normalement j'utiliserais un événement, mais dans ce cas je dois le faire de cette façon. Malheureusement, il n'y a pas de "liste" Keyboard.CurrentlyDownKeys. Au moins, je ne l'ai pas vu.
Merci, Chris
EDIT: Ok, car il semble être une plus grande affaire, voici la raison: J'ai défini un « KeySet » qui sert DictionaryKey pour les fonctions personnalisées. Si quelqu'un clique sur un élément, le wrapper parcourt le dictionnaire et vérifie si l'un des "Keysets" prédéfinis est actif.
Cela me permet de définir des déclencheurs simples, comme par exemple Exécutez cette fonction si vous appuyez sur ALT + A + B. Une autre option est par exemple Exécutez cette fonction si vous appuyez sur ALT + STRG + A (lors d'un clic de souris sur un élément WPF). Le seul "problème" avec l'implémentation actuelle, si je définis un Keyset qui ne contient pas de clés REAL, comme si on appuie sur ALT, il est également déclenché si on appuie sur ALT + A. Oh, en écrivant ceci, je réalise qu'il y a un autre problème. ALT + A + B se déclencherait également si ALT + A + B + C est pressé.
Peut-être que mon approche est erronée, et je devrais créer un « outil de suivi clé statique » et comparer les keyset à ses valeurs (aquired par les événements) .. Je vais essayer ce.
EDIT 2 Cela ne fonctionne pas, du moins pas de manière simple. J'ai besoin d'un FrameworkElement pour attacher à KeyDown, mais je ne l'ai pas dans un constructeur statique. Et je ne suis pas intéressé par KeyDownEvents d'un certain élément, mais « globalement » ... Je pense que je saillir reporter ce problème, ce ne est pas si important que cela. Pourtant, si quelqu'un connaît une meilleure approche différente ...
Tant, pour tous ceux qui se soucie, voici un code:
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;
}
}
Quelle est votre application? Console? Windows Forms? WPF? Site Internet? – jrista
Voir le titre ... .NET C# –
Cela n'aide pas. –