Question

Dans VB6, j'ai utilisé un appel à l'API Windows, GetAsyncKeyState , pour déterminer si l'utilisateur a appuyé sur la touche Échap pour lui permettre de sortir d'une longue boucle en cours d'exécution.

Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Existe-t-il un équivalent en .NET pur nécessitant un appel direct à l'API?

Était-ce utile?

La solution

Vous pouvez trouver la déclaration P / Invoke de GetAsyncKeyState dans http: // pinvoke. net / default.aspx / user32 / GetAsyncKeyState.html

Voici la signature C # par exemple:

[DllImport("user32.dll")]
static extern short GetAsyncKeyState(int vKey);

Autres conseils

En fonction de l’utilisation que vous souhaitez utiliser, vous avez le choix entre plusieurs options, dont l’appel de la même méthode que celle décrite ci-dessus). Depuis une application console:

bool exitLoop = false;
for(int i=0;i<bigNumber && !exitLoop;i++)
{
    // Do Stuff.
    if(Console.KeyAvailable)
    {
        // Read the key and display it (false to hide it)
        ConsoleKeyInfo key = Console.ReadKey(true);
        if(ConsoleKey.Escape == key.Key)
        {
            exitLoop=false;
        }
    }
}

Si vous travaillez sur un formulaire Windows, chaque formulaire comporte un certain nombre d'événements clés que vous pouvez écouter et manipuler si nécessaire (Logique simplifiée):

public partial class Form1 : Form
{
    private bool exitLoop;
    public Form1()
    {
        InitializeComponent();
        this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
    }
    public void doSomething()
    {
        // reset our exit flag:
        this.exitLoop = false;
        System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(delegate(object notUsed)
            {
                while (!exitLoop)
                {
                    // Do something
                }
            }));
    }
    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (Keys.Escape == e.KeyCode)
        {
            e.Handled = true;
            this.exitLoop = true;
        }
    }

}

Notez que ceci est très très simplifié - il ne résout aucun des problèmes de threads habituels ni rien de ce genre. Comme il a été souligné dans les commentaires, la version originale ne remédiait pas à ce problème. J'ai ajouté un petit appel rapide ThreadPool pour mettre en arrière-plan. Notez également que le problème avec l'écoute des événements clés est que d'autres contrôles peuvent en réalité les gérer. Vous devez donc vous assurer que vous vous enregistrez pour l'événement sur le (s) bon (s) contrôle (s). Si vous utilisez une application de formulaire Windows, vous pouvez également essayer de vous injecter vous-même dans la boucle de message ...

public override bool PreProcessMessage(ref Message msg)
{
  // Handle the message or pass it to the default handler...
  base.PreProcessMessage(msg);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top