2010-12-08 8 views
2

Ich muss auf Keydown-Ereignisse (O, C, G-Tasten usw., nicht Modifier-Tasten) reagieren, während eine Drag + Drop-Operation über mein Steuerelement (d. H. Zwischen DragEnter und DragLeave) ausgeführt wird. In diesem Stadium wird das KeyDown-Ereignis jedoch nicht aufgerufen.Handle KeyDown während eines Drag-Drop

Ich habe versucht, meine Kontrolle auszuwählen und den Fokus auf DragEnter zu setzen, aber das funktioniert nicht.

EDIT:

Hans' Antwort ist grundsätzlich richtig, außer ich GetAsynchKeyState verwenden musste, um das Verhalten zu bekommen ich wollte.

Antwort

3

Das QueryContinueDrag-Ereignis wird beim Ziehen Quelle ausgelöst. Die Prüfung auf den Status der Schlüssel, an denen Sie interessiert sind, erfordert Pinvoke. Das Ereignis dient nur dazu, die Änderungen des Escape-Schlüssels und des Modifier-Tasters zu erkennen. Was zu beachten ist, dass diese Tasten eine spezielle Aktion haben, ist sehr unauffindbar.

[DllImport("user32.dll")] 
    private static extern short GetKeyState(Keys key); 

Es gibt einen Wert < 0 zurück, wenn die Taste gedrückt ist. Ich kann nicht sagen, dass es garantiert funktioniert, aber es sah gut aus, als ich es versuchte.

+1

Dank Hans, es zu tun. Sie müssen sich keine Sorgen über die Auffindbarkeit machen, zusätzliche Informationen zu Tastenkürzeln werden während des Ziehens in das Steuerelement übernommen. –

2

Sie können auch versuchen: Keyboard.IsKeyDown(); Methode zu überprüfen, ob eine bestimmte Taste gedrückt wird, das heißt:

bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt); 

Es ähnlich ist zu der vorherige Antwort, aber es ist eine native .NET-Methode, so tut es nicht Sie müssen alle Funktionen importieren. Eine ähnliche Frage wurde hier gestellt: Handle KeyDown during a drag drop. Or keydown event not workign, aber es gab einen Vorschlag, damit es wie ein Ereignis funktioniert.

UPDATE

Die erste Lösung scheint in WPF nur zu arbeiten. Wenn Sie Status der Modifierschlüssel überprüfen möchten, gibt es jedoch eine Methode, die eine Eigenschaft Form.ModifierKeys verwendet, die in WinForms ordnungsgemäß funktionieren sollte. Das Beispiel zeigt, wie Sie überprüfen, ob alt (links alt) und ctrl Tasten beide gedrückt sind:

if (Form.ModifierKeys == (Keys.Alt | Keys.Control)) 
{ 
    //TODO: insert your code here 
} 
+0

Guter Rat, aber WPF ist jetzt erlaubt. Ich muss nur bei Winforms bleiben. –

+0

Oh, Entschuldigung, ich habe es nicht bemerkt. Ich habe jedoch eine andere Methode gefunden, dies für Modifier-Schlüssel zu tun, die korrekt funktionieren sollten, wenn Sie WinForms verwenden. –

Verwandte Themen