2012-06-05 43 views
6

Cuando grabo esta secuencia, falla. Sé que puedo enviar Control + A usando Keyboard.SendKeys (control, "A", ModifierKeys.Control), pero ¿cómo envío una secuencia que retiene el control y lance la carta antes de presionar la siguiente letra?¿Cómo enviar las teclas Control + A + B? (mantener el modificador de control "presionado")

Nota: la secuencia Busco es similar al acceso directo de Visual Studio por defecto para comentar una línea Control + K + C

quizá Es esto algo que sólo hay que utilizar la API de Windows para?

+0

** ** La pregunta con trampa modificador no tiene que permanecer presionado en este particular! caso :) Intente Ctrl + K Ctrl + C en VS. Sin embargo, puedo imaginar casos en los que liberar Control desencadenaría un evento/reinicio, por lo que sigue siendo una pregunta válida ... –

+0

Aparentemente, Visual Studio acepta cualquiera de las versiones. Supongo que ha sido costumbre mantener la tecla de control allí. Necesito obtener el control_down a_down, a_up, b_down, control_up b_up – stoj

Respuesta

4

keybd_event es muy conveniente para esto (mucho más fácil de usar que el "reemplazo" 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); 

Si sólo alguna vez tiene que mantener pulsado el control, alt, y/o turno, comprobar TCS's answer of SendKeys.Send. keybd_event es más potente y le permitirá mantener presionada cualquier tecla y soltarla en cualquier orden.

+0

Iría con keybd_event() en C++ (que normalmente uso) pero en C# eso significa que necesitas p/invocar, y no tienes las definiciones "VK_" # que tienes en los archivos .h. En la mayoría de los casos en C# creo que es más fácil usar SendKeys, pero en general, keybd_event() es mucho más flexible ... – TCS

+0

@TCS: puede usar 'System.Windows.Forms.Keys', ya que [ la documentación] (http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx) dice "los bits de orden superior que contienen el código clave (que es lo mismo que un Windows virtual código de clave) " –

+0

Es bueno saberlo :-) – TCS

1

¿Qué hay de usar sólo

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

?

+2

Creo que debería funcionar en el caso VS, pero algunas aplicaciones podrían restablecer la secuencia en "key up" .... –

+0

La aplicación con la que estoy trabajando ciclos cuando se suelta la tecla de control. – stoj

5

Por lo que entiendo de la SendKeys.Send documentation sería:

SendKeys.Send("^(KC)") 

Lo siguiente puede ser encontrado en los comentarios:

Para especificar que cualquier combinación de SHIFT, CTRL y ALT debe presione mientras se presionan varias teclas más, encierre el código de esas teclas entre paréntesis. Por ejemplo, para especificar mantener presionado SHIFT mientras se presionan E y C, use "+ (EC)". Para especificar mantener presionado SHIFT mientras se presiona E, seguido de C sin MAYÚS, use "+ EC".

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx. Echa un vistazo a la sección de comentarios. – TCS

0

simplemente usar el código, como a continuación:

Keyboard.SendKeys("^AB"); 
1

Esto funcionó para mí:

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