Problème de reconnaissance des touches du clavier

Noxalus Messages postés 12 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 24 avril 2011 - 12 déc. 2009 à 23:44
Noxalus Messages postés 12 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 24 avril 2011 - 15 déc. 2009 à 20:24
Salut à tous ! :)

Je suis en train de réaliser un petit snake en mode console en C# pour m'entrainer et mieux maîtriser ce langage. Seulement, lorsque je lance mon projet, Visual Studio C# 2008 me sort:

Le thread appelant doit être en mode STA, comme l'exigent de nombreux composants de l'interface utilisateur.


Tout en me montrant cette ligne:

if(Keyboard.IsKeyDown(Key.Left) && direction !0 || direction 2)



Ce ne m'a pas tellement étonné puisque avant même de me lancer dans le reste du code, un simple test de ce genre me donnait la même erreur:


while(true)
{
    if(Keyboard.IsKeyDown(Key.Left))
    {
        Console.Write("Test !");
    }
}



Savez-vous d'où vient le problème ? Parce que les résolutions qu'ils donnent dans la doc ne correspondent en rien à mon code :(

Merci d'avance ! :)

4 réponses

Noxalus Messages postés 12 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 24 avril 2011
15 déc. 2009 à 00:57
Merci pour la réponse ! :)

Par contre, bien qu'il n'y ait plus d'erreur, ça ne marche pas comme je voudrais :(

Voici mon code de test:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Threading;

namespace Touche
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            while (!Keyboard.IsKeyDown(Key.F4))
            {
                Console.WriteLine("Test !");
                Thread.Sleep(1000);
            }
        }
    }
}


J'ai beau marteler la touche F4 de mon clavier, je ne sors jamais de la boucle O_o

C'est normal ? Comment faire autrement pour détecter l'appui de touches en temps réel ?

Merci d'avance ! :)
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
15 déc. 2009 à 10:19
Désolé, je ne me suis jamais intéressé à l'attente d'une frappe au clavier... mais vu d'ici, je me pose une question: ton prog dort 1 seconde, puis exécute un test qui lui prend un pouième de seconde, puis re-dodo... autrement dit, il faut vraiment appuyer sur la touche au bon moment!! Est-ce que tu as essayé en restant appuyé sur la touche?
Perso, pour intercepter une frappe à n'importe quel moment, je le ferais plutôt comme ça (simple question d'algorithme, je ne cherche pas à savoir si le code fonctionne puisque je ne maîtrise pas le clavier!):
        [STAThread]
        static void Main(string[] args)
        {
            bool Fin= false;
            while (!Fin)
            {
                if(Keyboard.IsKeyDown(Key.F4)) 
                    Fin = true;
                else
                    Console.Write(".");
            }
        }



Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
0
Noxalus Messages postés 12 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 24 avril 2011
15 déc. 2009 à 20:24
Oui, je me doutais bien que l'appui d'une touche devait se faire très rapidement et j'ai même essayé en restant appuyé => même résultat

Sinon, ton code est à peu près l'équivalent au miens (si ce n'est qu'on utilise une variable en plus). Mais j'ai quand même testé. Malheureusement, c'est toujours la même chose. Enfin non, je vois plus "Test", mais y a des points partout :p

Merci quand même !
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
14 déc. 2009 à 13:28
Salut,

Il faut ajouter l'attribut STAThread au niveau de ton Main():

[STAThread]
static void Main(string[] args)
{
  ...
}


Voilou!

Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
-1
Rejoignez-nous