Fondamentalmente, ho un modulo con un controllo personalizzato su di esso (e nient'altro). Il controllo personalizzato è completamente vuoto e il modulo ha KeyPreview impostato su true.Eventi tasto freccia non in arrivo
Con questa configurazione, non ricevo alcun evento KeyDown per alcun tasto freccia o Tab. Ogni altra chiave che ho sulla mia tastiera funziona. Ho gestori di eventi KeyDown collegati a tutto ciò che ha tali eventi, quindi sono sicuro che non mi manca nulla.
Si noti inoltre che se rimuovo il controllo personalizzato (completamente vuoto), ottengo gli eventi del tasto freccia.
Che diavolo sta succedendo qui?
EDIT:
ho aggiunto che questo sia la forma ed il controllo, ma non sto ancora ricevendo i tasti freccia:
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x100: //WM_KEYDOWN
//this is the control's version. In the form, it's this.Text
ParentForm.Text = ((Keys)m.WParam).ToString();
break;
}
base.WndProc(ref m);
}
Ho anche controllato con Spy ++, e determinato che la forma stessa non sta ricevendo alcun messaggio WM_KEYDOWN, stanno andando tutti al controllo. Tuttavia, detto questo, il controllo sta ottenendo il tasto freccia WM_KEYDOWN. Sospiro.
Modifica 2: Ho anche aggiornato il file ZIP con questa versione. Si prega di vedere le cose, se si vuole aiutare ...
Edit 3:
ho capito questo, più o meno. Il modulo sta mangiando i tasti freccia, probabilmente nel tentativo di mantenere la concentrazione tra i suoi figli. Ciò è dimostrato dal fatto che ottengo gli eventi se il modulo è vuoto.
Comunque, se posso aggiungere questo codice al form, ho iniziare a ricevere di nuovo gli eventi:
public override bool PreProcessMessage(ref Message msg) {
switch (msg.Msg) {
case 0x100: //WM_KEYDOWN
return false;
}
return base.PreProcessMessage(ref msg);
}
Quando ho sovrascrivere questo, il modulo non viene la possibilità di fare il suo sporco lavoro, e così Ottengo i miei eventi KeyDown come mi aspetto. Presumo che un effetto collaterale di questo è che non posso più usare la mia tastiera per navigare nel modulo (non è un grosso problema in questo caso, dato che è un gioco, e l'intero scopo di questo esercizio è implementare la navigazione da tastiera!)
La questione rimane ancora su come disattivare questa "correttamente", se c'è un modo ...
Sembra che il modulo su cui è attivo il controllo utente stia catturando l'evento e lo imposti per essere gestito prima che l'utente venga controllato da UserControl. Stai assicurando che il controllo utente sia attivo quando viene premuto il tasto? –