C # SendKeys.Send - PullRequest
       50

C # SendKeys.Send

5 голосов
/ 18 июня 2009

Я работаю над проблемой с использованием метода C # SendKeys.Send. Я пытаюсь заменить клавиши клавиатуры другими клавишами, например, когда я нажимаю «a» на клавиатуре, я хочу, чтобы эта клавиша была «s», например, когда я делаю это в своем коде:

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

}

Прямо сейчас у меня в блокноте печатается только символ "sa", но вместо печати "sa" мне нужно получить только символ "s", потому что, когда я нажимаю "a" на клавиатуре, "a" должен быть заменен на "s".

Я попытался удалить последний символ, добавив эту строку:

SendKeys.Send("{BS}");

Но все, что я получил, это убрал символ "s" и там был символ "a".

Как я могу предотвратить это?

Ответы [ 9 ]

2 голосов
/ 18 июня 2009

Возможно, я ошибаюсь, но если вы используете это с текстовым полем, вы можете:

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

Или даже проще:

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

Или, если это не для использования только с текстовым полем, то вы не можете просто отменить возврат и возврат клавиш s?

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("{BS}"); // remove A
    SendKeys.Send("s");    // add S
}
2 голосов
/ 18 июня 2009

Другой вариант, который у вас есть, - это использовать низкоуровневые перехватчики клавиатуры, чтобы перехватить старый символ, а затем отправить нового. Это потребует некоторого P / Invoke, но дает вам возможность полностью перехватить оригинальный ключ, чтобы приложения даже не видели его.

2 голосов
/ 18 июня 2009

Я бы перевернул мои звонки:

SendKeys.Send("{BS}");

SendKeys.Send("S");

РЕДАКТИРОВАТЬ (после обновления вопроса):

Если вы работаете со строкой (для специальных символов), можете ли вы просто захватить строку, генерируемую нажатием клавиши («a»), и изменить ее, установив в строке значение Юникода символа, который вы Пытаетесь представлять? Если другие решения, о которых упоминали люди, не работают, я бы попробовал следующее ...

1 голос
/ 18 июня 2009

Я думаю, что подход SendKeys.Send("{BS}"); никогда не будет работать (в любом порядке). Это связано с тем, что исходное событие нажатия клавиши / отпускания клавиши обрабатывается после публикации SendKeys.Send. Я думаю, вам следует как-то отменить событие нажатия клавиши / нажатия клавиши для символа, который вы хотите удалить, прежде чем он будет обработан процедурой целевого окна (например, блокнота).

1 голос
/ 18 июня 2009

Это может быть не то, что вам нужно / нужно, но если вы просто хотите переназначить некоторые клавиши клавиатуры, я бы посоветовал изучить использование другой раскладки клавиатуры или создание собственной раскладки. Вы можете создавать новые макеты с этим:

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

1 голос
/ 18 июня 2009

SendKeys.SendWait

1 голос
/ 18 июня 2009

Я напечатал «а», потому что Backspace отправлено сразу после "s" и это удаляет символ "s" Как я могу предотвратить это?

ммм .....

не отправлять backspace сразу после отправки s?

if ((Keys)keyCode== Keys.A)
            {
                Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
                SendKeys.Send("s"); // Sends the "S"
            }
0 голосов
/ 19 июня 2009

Я решил эту проблему, зарегистрировав глобальные горячие клавиши. Спасибо. Этот был ресурсом, который я использовал для решения своей проблемы.

0 голосов
/ 18 июня 2009

Вы пробовали переключать .Send({BS}) с .Send("s")? В противном случае, вы можете уточнить?

...