Frage

In VB6 benutzen ich einen Aufruf an dem Windows-API, GetAsyncKeyState , um festzustellen, ob der Benutzer die ESC-Taste getroffen hat, damit sie von einer langen Laufschleife verlassen aus.

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

Gibt es ein Äquivalent in reinen .NET, die einen direkten Aufruf an die API benötigt?

War es hilfreich?

Lösung

Sie können die P finden / Invoke Erklärung für GetAsyncKeyState von http: // pinvoke. net / default.aspx / user32 / GetAsyncKeyState.html

Hier ist der C # -Signatur zum Beispiel:

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

Andere Tipps

Je nach gewünschter Anwendung gibt es eine Reihe von Optionen, einschließlich der gleichen Methode aufrufen, wie oben beschrieben). Von einer Konsole App:

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;
        }
    }
}

Wenn Sie auf einem Windows-Formular arbeiten, jede Form eine Reihe von wichtigen verwandten Ereignissen hat, können Sie hören und zu handhaben, wie notwendig (die meisten der Logik vereinfacht):

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;
        }
    }

}

Beachten Sie, dass dies sehr vereinfacht - es behandelt nicht alle üblichen Threadingprobleme oder so etwas. Wie in den Kommentaren darauf hingewiesen, hat der ursprüngliche go-round nicht das Problem zu lösen, habe ich einen schnellen kleinen Thread Aufruf die Hintergrundarbeit fädeln. Beachten Sie auch, dass das Problem für die wichtigsten Ereignisse mit dem Hören ist, dass andere Steuerelemente sie tatsächlich behandeln kann, so müssen Sie sicherstellen, dass Sie für den Fall auf der richtigen Steuerregister (s). Wenn ein Windows-Formular-Anwendung ist die Richtung Sie gehen, können Sie auch selbst in die Nachrichtenschleife zu injizieren versuchen, sich selbst ...

public override bool PreProcessMessage(ref Message msg)
{
  // Handle the message or pass it to the default handler...
  base.PreProcessMessage(msg);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top