5

I am running on an issue using C# SendKeys.Send method. I am trying to replace keyboard keys with other keys, for example when I press "a" in keyboard I want that key to be "s" for example, when I am doing this in my code:

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

}

Right now I get only "sa" character printed in my notepad, but instead of printing "sa" I need to get only "s" character in this case because when I press "a" on my keyboard, "a" must be replaced with "s".

I tried removing the last character by adding this line:

SendKeys.Send("{BS}");

But all I got is "s" character removed and "a" character was there.

How can I prevent this from happening?

John Saunders
  • 160,644
  • 26
  • 247
  • 397
milot
  • 1,060
  • 2
  • 8
  • 17
  • 3
    No this is for a project that I was assigned to do. In my own language we have some special characters "ë" and "ç" which I have to remap the "[" and "]" keys to match the special characters that I showed you, in order when the people write to our native Albanian language to ahve the keys remapped. – milot Jun 18 '09 at 13:58

9 Answers9

2

I would reverse my calls:

SendKeys.Send("{BS}");

SendKeys.Send("S");

EDIT (After Question Updated):

If you're working with the string (for your special characters), can you not just capture the string generated by the key press ("a") and modify it by setting the string to the unicode value of the character you're attempting to represent? If the other solutions people have been mentioning aren't working, that's where I'd try next...

AllenG
  • 8,112
  • 29
  • 40
2

I might be making a bad assumption, but if you are using this with a text box, you could:

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");
    }
}

Or even simpler:

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

Or if this isn't for use just with a text box, then can't you just revers your backspace and s key sends?

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("{BS}"); // remove A
    SendKeys.Send("s");    // add S
}
Raktim Biswas
  • 4,011
  • 5
  • 27
  • 32
CodingWithSpike
  • 42,906
  • 18
  • 101
  • 138
2

Another option you have is to use Low-Level keyboard hooks to trap the old character and then send the new one. It will require some P/Invoke, but it gives you the ability to completely trap the original key so apps don't even see it.

Erich Mirabal
  • 9,860
  • 3
  • 34
  • 39
1

I get "a" printed because backspace is sent immediately after "s" and it deletes the "s" character. How can I prevent this from happening?

uhm.....

don't send backspace immediately after sending s?

if ((Keys)keyCode== Keys.A)
            {
                Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
                SendKeys.Send("s"); // Sends the "S"
            }
tom.dietrich
  • 8,219
  • 2
  • 39
  • 56
1

SendKeys.SendWait

1

This may not be what you want/need, but if you just want to remap some keyboard keys, I would suggest looking into using another keyboard layout, or creating a custom layout. You can create new layouts with this:

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

Sean
  • 4,450
  • 25
  • 22
  • Thank you very much for your suggestion, but I need to remap the keyboard layout programmaticaly. – milot Jun 18 '09 at 13:52
1

I think that the SendKeys.Send("{BS}"); approach will never work (in either order). That's because the original key-pressed/key-released event gets processed after SendKeys.Send is posted. I think you should somehow cancel the key-down/key-up event for the character you want to remove before it is processed by the target window procedure (e.g. notepad's).

Utaal
  • 8,484
  • 4
  • 28
  • 37
0

Have you tried switching .Send({BS}) with .Send("s")? Otherwise, can you clarify?

Andrew
  • 1,853
  • 1
  • 14
  • 15
0

I solved this problem by registering global hot keys. Thank you. This was the resourse that I used to solve my problem.

milot
  • 1,060
  • 2
  • 8
  • 17