Domanda

Sto usando evento PreviewKeyDown su una finestra per ricevere tutte le chiavi di uno scanner di codici a barre. I KeyEventArgs è un'enumerazione e non mi dato la stringa effettiva. Non voglio usare TextInput come alcune delle chiavi possono ottenere gestito dal controllo stesso e non può bolla fino alla manifestazione TextInput.

Sto cercando un modo per convertire le chiavi che ricevo in PreviewKeyDown alla stringa effettiva. Ho guardato l'etc InputManager, TextCompositionManager ma io non sto trovando un modo in cui io do l'elenco dei tasti e ritorna con una stringa. TextCompositionManager o qualcosa deve essere convertendo questi tasti per una stringa che è ciò che è disponibile in TextInput.

È stato utile?

Soluzione

Questa è la manifestazione che sto usando. Il KeyDown ottiene le chiavi e il PreviewTextInput ottiene il testo vero e proprio. Quindi, in qualche parte tra i tasti sono sempre convertiti in testo.

 public Window1()
            {
                InitializeComponent();
                TextCompositionManager.AddPreviewTextInputStartHandler(this, new TextCompositionEventHandler(Window_PreviewTextInput));
                this.AddHandler(Window.KeyDownEvent, new System.Windows.Input.KeyEventHandler(Window_KeyDown), true);
            }

    private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
            }

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

Altri suggerimenti

Key -> conversione di testo è molto più complicata di quanto si pensi, non v'è in realtà un modo per mappare un singolo tratto chiave per un singolo personaggio, perché in alcune lingue e alcuni casi è necessario più sequenze di tasti per comporre un singolo carattere

Dal momento che siete interessati ad ingresso da uno scanner di codici a barre (che presumo genererà solo un piccolo sottoinsieme di quello che le finestre possono gestire, forse solo ASCII forse anche meno) si può costruire la tabella di conversione da soli e duro codice nel vostro programma di - è molto più facile da gestire poi tutte le follie che la gestione di testo di Windows lo fa (per divertimento, ricerca "dead keys").

Ok, rubato da questo post .

[DllImport("user32.dll")]
static extern short VkKeyScan(char ch);

static public Key ResolveKey(char charToResolve)
{    
    return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top