hook di tastiera globali di alto livello per C # e WPF per la lettura di uno scanner carta di emulazione tastiera

StackOverflow https://stackoverflow.com/questions/2137099

Domanda

codice

L'unico gancio tastiera di sostegno per NET gestito è un gancio basso livello della tastiera (WH_KEYBOARD_LL).

utilizzando il gancio tastiera globale (WH_KEYBOARD_LL) in WPF / C #

Ho il codice di cui sopra a lavorare nella mia applicazione nel momento in modo che quando si strisciare la carta si otterrà un elenco di tutte le combinazioni di tasti. Il problema è per la tipizzazione delimitatore caratteri come "%" e ";" mi invierà Alt + Numpad +? oggetti WPF tasto corrispondente a questi simboli.

La mia domanda: C'è qualche modo per rendere questo si comporti più alto livello, che è, per catturare una stringa generata da tutti i comandi da tastiera

?

Cheers!

È stato utile?

Soluzione

Non sei sicuro di quello che sta succedendo, ma ottenere un personaggio come% di un gancio tastiera è molto untrivial. Il gancio notifica solo di tasti virtuali. Ma% è una chiave di battitura, prodotta premendo Shift + 5 sulla mia tastiera (un layout degli Stati Uniti). Windows normalmente produce questi personaggi elaborando i messaggi WM_KEYDOWN / UP, generando un messaggio WM_CHAR per la chiave di battitura. Questo non sta succedendo nel vostro caso. La funzione di basso livello di Windows che fa questo è ToUnicodeEx ().

Altri suggerimenti

Direi se si sta strisciando la carta, c'è un ingresso da qualche parte sul modulo WPF, come una casella di testo, per esempio? Poi sarei propenso ad aggiungere un evento, forse un gestore KeyUp Event, (Lo scanner scheda di emulazione tastiera non invia un segnale di fine lavorazione, come INVIO per indicare il colpo era sì di successo?), Nel gestore di eventi KeyUp, costruire una stringa utilizzando StringBuilder, e quando il segnale di fine lavorazione, come INVIO e 'colto, è possibile rimuovere il "%" e ";" dall'istanza StringBuilder e fare quello che devi fare con esso.

Potrebbe essere più facile da usare un sistema statale, quando il gestore di eventi KeyUp riceve un "%", quindi entrare in un altro stato in cui lo stato finale previsto sarebbe un ";"

static bool StartState = false;
StringBuilder sbInput = new StringBuilder();
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
   if (!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }else{
    if (e.KeyCode == Keys.OemSemicolon){
       StartState = false;
       // sbInput will contain the data from the scanner,
       // copy it somewhere else and reset sbInput
       // sbInput.Remove(0, sbInput.Length); 
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

Spero che questo aiuti, I migliori saluti, Tom.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top