2013-03-22 18 views
6

Come posso attivare un evento di pressione del tasto senza premere il tasto dalla tastiera? Ho provato con la soluzione da here, ma ho avuto la seguente eccezione:Attivazione di un evento della tastiera premendo un tasto senza premere il tasto dalla tastiera

La partita metodo migliore overload per 'System.Windows.PresentationSource.FromVisual (System.Windows.Media.Visual)' ha qualche valida argomenti.

consideri Shift + A contiene 2 evento premere il tasto dalla tastiera, come posso farlo senza premere tastiera? (Lasciare, basta stampare maiuscola in una casella di testo su un pulsante del mouse)

mio codice

var key = Key.A;     // Key to send 
var target = Keyboard.FocusedElement; // Target element 
var routedEvent = Keyboard.KeyDownEvent; // Event to send 

target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice, System.Windows.PresentationSource.FromVisual(target), 0, key) { RoutedEvent = routedEvent }); 
+1

hai provato l'esempio sendkeys nel tuo link? – RandomUs1r

+0

@ RandomUs1r, Sì, ho provato, ma ho bisogno di un obiettivo per inviare quella chiave.Se ci sono 10 caselle di testo in un modulo, allora quale dovrebbe essere il criterio? Voglio scrivere A dove c'è il focus corrente per il quale ho usato Keyboard. FocusedElemento nel codice precedente. Hai qualche idea? – ridoy

+0

Vorrei usare invece la classe focusmanager: http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.aspx. Ad un livello più alto però, probabilmente proverei ad implementare qualcosa di simile in jQuery. – RandomUs1r

risposta

8

System.Windows.Forms.SendKeys.Send() ha fatto il trucco per me.

Per le istruzioni avanzate e l'elenco dei codici disponibili, consultare the docs for the method.

Ad esempio, per inviare Maiusc +A ho usato SendKeys.Send("+(a)").

2

È necessario lanciare a Visual:

var key = Key.A;     // Key to send 
var target = Keyboard.FocusedElement; // Target element 
var routedEvent = Keyboard.KeyDownEvent; // Event to send 

target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice, 
System.Windows.PresentationSource.FromVisual((Visual)target), 0, key) { RoutedEvent = routedEvent }); 

Si potrebbe anche specifica che il tuo obiettivo è una casella di testo specifica, ad esempio:

var target = textBox1; // Target element 

Ciò che il codice fa effettivamente è attivare l'evento keydown per un elemento specifico. Quindi ha senso avere un gestore keydown per esso:

private void textBox1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 

} 
+0

Ma si ottiene una nuova eccezione durante il tentativo del codice precedente, il valore non può essere null.Parameter name: v ... – ridoy

+0

@ridoy quale riga genera l'errore? –

+0

target.RaiseEvent() in questa riga .. – ridoy

Problemi correlati