2010-05-24 17 views
11

Come posso convertire il tasto backslash ('\') nel codice chiave?Come convertire un carattere in codice chiave?

Il mio codice backslash tastiera è 220, ma il metodo seguito

(int)'\\' 

mi restituisce 92.

Ho bisogno di conversione generico come

int ConvertCharToKeyValue(char c) 
{ 
    // some code here... 
} 

Tutte le idee?

+0

Hai mai risolto questo problema con successo? Hai ancora bisogno di aiuto con questo? – jcolebrand

+0

Hai visto questa risposta? http://stackoverflow.com/questions/318777/c-how-to-translate-virtual-keycode-to-char – jcolebrand

+0

Sì. Ho bisogno di convertire da char a int. E ho bisogno di una soluzione indipendente dalla piattaforma. Senza WM_Messages ... –

risposta

0

Non c'è una funzione che io sappia che mapperà un carattere a un codice tasto virtuale. Tuttavia, è possibile utilizzare la seguente tabella per iniziare a costruire tale mappatura.

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx.

Nota che è necessario conoscere la tastiera, guardando la chiave che si cita '\' questa è la chiave virtuale VK_OEM_5 che per le tastiere degli Stati Uniti è '\' se non è spostata e '|' se spostato, quindi la funzione dovrà conoscere anche la tastiera utilizzata.

Ovviamente, se si desidera mappare da un codice tasto virtuale a un carattere, è possibile utilizzare interop per chiamare la funzione MapVirtualKeyEx.

Aggiornamento Sulla base del tuo commento questo ti darà quello che vuoi.

[DllImport("user32.dll")] 
static extern int MapVirtualKey(int uCode, uint uMapType); 

const uint MAPVK_VK_TO_CHAR = 0x02; 

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR); 
    if (key == (int)'\\') 
    { 

    } 
} 
+0

Grazie per il link.Ho letto: VK_OEM_5: 0xDC: 220 Utilizzato per caratteri vari; può variare a seconda della tastiera. ~~~~~~~~~~~~~~~~~~ Per la tastiera standard statunitense, il '\ |' chiave Ho bisogno della soluzione indipendente dalla tastiera. Probabilmente la soluzione migliore sarà qualcosa del tipo: TextBox_KeyDown public void (object sender, KeyEventArgs e) { if ((String.Parse (e.KeyCode) .EndsWith ("\\")) ... } –

+0

@ Murat, non esiste una funzione String.Parse() Ho aggiunto un esempio che dovrebbe aiutare con quello che sembra voler fare qui: –

16

È possibile P/Richiamare VkKeyScan() per convertire un codice tasto digitazione in una chiave virtuale. Attenzione che lo stato del tasto modificatore è importante, ottenendo "|" richiede di tenere premuto il tasto Maiusc sulla mia tastiera. La tua firma funzione non consente per questo qualcosa di così ho appena inventato:

public static Keys ConvertCharToVirtualKey(char ch) { 
     short vkey = VkKeyScan(ch); 
     Keys retval = (Keys)(vkey & 0xff); 
     int modifiers = vkey >> 8; 
     if ((modifiers & 1) != 0) retval |= Keys.Shift; 
     if ((modifiers & 2) != 0) retval |= Keys.Control; 
     if ((modifiers & 4) != 0) retval |= Keys.Alt; 
     return retval; 
    } 

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

attenzione anche del layout di tastiera che devono utilizzare i tasti morti (Alt + Gr) per generare chiavi di battitura. Questo tipo di codice è meglio evitare.

1

Se

var char = System.Windows.Forms.Keys.OemPipe; // 220 
var code = (int)char; 

poi

public static int ToKeyValue(this char ch) 
{ 
    return (int)(System.Windows.Forms.Keys)ch; 
} 
+0

Ho avuto l'impressione che 'OemPipe' sarebbe' | 'e' OemBackslash'. sarebbe '\\' – Powerlord

+0

@R. Bemrose: Sì, lo sarebbe. Ma quando premo '\' sulla tastiera (che è in Backspace e sopra Enter) la mia casella di testo test attiva l'evento 'KeyUp' dove' KeyCode = 220' che OP sta cercando – abatishchev

0

Oppure si potrebbe fare cose semplici e gettalo via.

(Keys)keyToConvert 
Problemi correlati