2012-06-05 4 views
6

Wenn ich diese Sequenz aufzeichne, schlägt sie fehl. Ich weiß, dass ich Control + A mit Keyboard.SendKeys (Steuerung, "A", ModifierKeys.Control) senden kann, aber wie sende ich eine Sequenz, die Kontrolle hält und den Brief freigibt, bevor ich den nächsten Buchstaben drücke.So senden Sie Schlüssel Control + A + B? (Kontrollmodifikator gedrückt halten)

Hinweis: Die Reihenfolge ich suche ist ähnlich die Standard-Visual Studio-Verknüpfung für eine Zeile Strg + K + C

Ist das etwas, vielleicht zu kommentieren, die ich brauche nur für die WinApi zu benutzen?

+0

** Trick Frage ** Der Modifikator muss nicht in diesem speziellen gedrückt zu bleiben! Fall :) Versuchen Sie Strg + K Strg + C in VS. Ich kann mir jedoch Fälle vorstellen, in denen die Freigabe von Control ein Event/Reset auslöst, so dass dies immer noch als gültige Frage steht ... –

+0

Anscheinend akzeptiert Visual Studio beide Versionen. Ich denke, es war nur eine Gewohnheit, den Kontrollschlüssel dort zu halten. Ich brauche die control_down a_down, a_up, b_down, control_up b_up – stoj

Antwort

4

keybd_event ist sehr bequem für diese (viel einfacher zu bedienen als die "Ersatz" SendInput).

keybd_event(Keys.Control, MapVirtualKey(Keys.Control, 0), 0, 0); 
keybd_event(Keys.A, MapVirtualKey(Keys.A, 0), 0, 0); 
keybd_event(Keys.A, MapVirtualKey(Keys.A, 0), KEYEVENTF_KEYUP, 0); 
keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), 0, 0); 
keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), KEYEVENTF_KEYUP, 0); 
keybd_event(Keys.Control, MapVirtualKey(Keys.Control, 0), KEYEVENTF_KEYUP, 0); 

Wenn Sie immer nur Kontrolle benötigen, halten Sie, alt, und/oder Verschiebung, überprüfen TCS's answer of SendKeys.Send. keybd_event ist leistungsfähiger und lässt Sie jede Taste gedrückt halten und in beliebiger Reihenfolge loslassen.

+0

Ich würde mit keybd_event() in C++ gehen (was ich normalerweise verwende), aber in C# bedeutet das, dass Sie p/invoke brauchen, und Sie haben nicht die "VK_" #defines, die Sie in .h-Dateien haben. In den meisten Fällen in C# Ich denke, es ist einfacher, SendKeys zu verwenden, aber alles in allem ist keybd_event() viel flexibler ... – TCS

+0

@TCS: Sie können 'System.Windows.Forms.Keys', seit [ Die Dokumentation] (http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx) sagt "die höherwertigen Bits, die den Schlüsselcode enthalten (der dem eines virtuellen Windows entspricht Schlüsselcode) " –

+0

Gut zu wissen :-) – TCS

1

Wie wäre es nur

mit
Keyboard.SendKeys(control, "A",ModifierKeys.Control); 
Keyboard.SendKeys(control, "B",ModifierKeys.Control); 

?

+2

Ich glaube, das sollte in der VS-Fall funktionieren, aber einige Anwendungen möglicherweise die Reihenfolge auf "Schlüssel hoch" .... –

+0

Die Anwendung, die ich arbeite mit Zyklen wenn die Steuerungstaste losgelassen wird. – stoj

5

Von dem, was ich aus dem SendKeys.Send documentation verstehen wäre es:

SendKeys.Send("^(KC)") 

Folgendes kann in den Ausführungen zu finden:

Um festzulegen, dass eine beliebige Kombination von SHIFT, STRG und ALT sollte gedrückt halten, während mehrere andere Tasten gedrückt werden, schließen Sie den Code für diese Tasten in Klammern ein. Um beispielsweise festzulegen, dass SHIFT gedrückt werden soll, während E und C gedrückt werden, verwenden Sie "+ (EC)". Um festzulegen, dass SHIFT gedrückt werden soll, während E gedrückt wird, gefolgt von C ohne SHIFT, verwenden Sie "+ EC".

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx. Schauen Sie sich den Abschnitt Bemerkungen an. – TCS

0

Verwenden Sie einfach den Code wie unten:

Keyboard.SendKeys("^AB"); 
1

Das ist für mich gearbeitet:

Keyboard.SendKeys("^(AB)");