Domanda

Sto correndo su un problema usando il metodo SendKeys.Send di C #. Sto cercando di sostituire i tasti della tastiera con altri tasti, ad esempio quando premo " a " in tastiera voglio che quel tasto sia "s" ad esempio, quando lo sto facendo nel mio codice:

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("s");                    

}

In questo momento ottengo solo " sa " carattere stampato nel mio blocco note, ma invece di stampare "sa" Devo ottenere solo " s " carattere in questo caso perché quando premo " a " sulla mia tastiera, " a " deve essere sostituito con " s " ;.

Ho provato a rimuovere l'ultimo carattere aggiungendo questa riga:

SendKeys.Send("{BS}");

Ma tutto quello che ho ottenuto è "quot" carattere rimosso e " a " personaggio era lì.

Come posso evitare che ciò accada?

È stato utile?

Soluzione 9

Ho risolto questo problema registrando i tasti di scelta rapida globali. Grazie. Questo era la risorsa che ero solita fare risolvi il mio problema.

Altri suggerimenti

Vorrei invertire le mie chiamate:

SendKeys.Send (" {} BS ");

SendKeys.Send (" S ");

MODIFICA (dopo aver aggiornato la domanda):

Se stai lavorando con la stringa (per i tuoi caratteri speciali), non puoi semplicemente catturare la stringa generata dal tasto premi (" a ") e modificarla impostando la stringa sul valore unicode del carattere stai cercando di rappresentare? Se le altre soluzioni citate dalla gente non funzionano, è qui che proverò dopo ...

Un'altra opzione che hai è quella di utilizzare i ganci della tastiera di basso livello per intrappolare il vecchio personaggio e quindi inviare quello nuovo. Richiederà un po 'di P / Invoke, ma ti darà la possibilità di intercettare completamente la chiave originale in modo che le app non la vedano nemmeno.

Potrei fare una cattiva ipotesi, ma se lo stai usando con una casella di testo, potresti:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a')
    {
        e.Handled = true;
    }
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A)
    {
        e.Handled = true;
        SendKeys.Send("s");
    }
}

O ancora più semplice:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a')
    {
        e.Handled = true;
        SendKeys.Send("s");
    }
}

O se questo non è da usare solo con una casella di testo, allora non puoi semplicemente invertire il tuo backspace e gli invii delle chiavi?

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("{BS}"); // remove A
    SendKeys.Send("s");    // add S
}

SendKeys.SendWait

Questo potrebbe non essere quello che vuoi / hai bisogno, ma se vuoi semplicemente rimappare alcuni tasti della tastiera, suggerirei di cercare di utilizzare un altro layout di tastiera o di creare un layout personalizzato. Puoi creare nuovi layout con questo:

http://msdn.microsoft.com/en-ca/goglobal /bb964665.aspx

Penso che l'approccio SendKeys.Send (" {BS} "); non funzionerà mai (in nessuno dei due ordini). Questo perché l'evento originale premuto tasto / rilasciato chiave viene elaborato dopo la pubblicazione di SendKeys.Send . Penso che dovresti in qualche modo annullare l'evento key-down / key-up per il personaggio che desideri rimuovere prima che venga elaborato dalla procedura della finestra di destinazione (ad es. Blocco note).

  

Ricevo " a " stampato perché backspace è   inviato immediatamente dopo " s " ed esso   elimina la "s" personaggio. Come posso   impedirlo?

uhm .....

non inviare backspace immediatamente dopo l'invio di s?

if ((Keys)keyCode== Keys.A)
            {
                Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
                SendKeys.Send("s"); // Sends the "S"
            }

Hai provato a cambiare .Send ({BS}) con .Send (" s ") ? Altrimenti, puoi chiarire?

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