C#发送键。发送

C#发送键。发送,c#,sendkeys,C#,Sendkeys,我正在使用C#SendKeys.Send方法处理一个问题。我正在尝试用其他键替换键盘键,例如,当我在键盘中按“a”时,我希望该键为“s”,例如,当我在代码中执行此操作时: if ((Keys)keyCode== Keys.A) { SendKeys.Send("s"); } 现在我的记事本上只打印了“sa”字符,但在这种情况下,我不需要打印“sa”,而只需要打印“s”字符,因为当我在键盘上按“a”时,“a

我正在使用C#SendKeys.Send方法处理一个问题。我正在尝试用其他键替换键盘键,例如,当我在键盘中按“a”时,我希望该键为“s”,例如,当我在代码中执行此操作时:

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

}
现在我的记事本上只打印了“sa”字符,但在这种情况下,我不需要打印“sa”,而只需要打印“s”字符,因为当我在键盘上按“a”时,“a”必须替换为“s”

我尝试通过添加以下行删除最后一个字符:

SendKeys.Send("{BS}");
但我得到的只是去掉了“s”字,而“a”字就在那里

我怎样才能防止这种情况发生

我会打印“a”,因为退格是 在“s”之后立即发送,并且 删除“s”字符。我怎么能 防止这种情况发生

发送s后不立即发送退格

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

您是否尝试过用
.Send(“s”)
切换
.Send({BS})
?否则,你能澄清一下吗?

我会撤销我的电话:

SendKeys.Send({BS})
SendKeys.Send(“S”)

编辑(问题更新后):


如果您正在使用字符串(针对您的特殊字符),您是否可以捕获按键(“a”)生成的字符串,并通过将字符串设置为您试图表示的字符的unicode值来修改它?如果人们提到的其他解决方案不起作用,我将在下一步尝试…

SendKeys.SendWait

我可能做出了一个错误的假设,但如果您将其与文本框一起使用,您可以:

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
}

这可能不是您想要/需要的,但如果您只是想重新映射一些键盘键,我建议您考虑使用其他键盘布局,或创建自定义布局。您可以使用以下命令创建新布局:


另一种选择是使用低级键盘挂钩捕获旧字符,然后发送新字符。它将需要一些P/Invoke,但它使您能够完全捕获原始密钥,以便应用程序甚至看不到它。

我认为

SendKeys.Send({BS}”)方法永远不会起作用(按任意顺序)。这是因为原始的按键按下/按键释放事件在发布
SendKeys.Send
后得到处理。我认为您应该在目标窗口过程(例如记事本)处理要删除的角色之前,以某种方式取消该角色的“向下键”/“向上键”事件。

我通过注册全局热键解决了此问题。非常感谢。
是我用来解决我的问题的资源。

只是一个注释:在原始问题更改为他正在使用记事本之前,我发布了此信息。我需要此信息是全局的,我正在使用Windows挂钩获取按下的全局键。非常感谢您的建议,但是我需要重新映射键盘布局程序Maticali。不,这是为了我被指派去做的项目。在我自己的语言中,我们有一些特殊的字符“ë”和“ç”,我必须重新映射“[”和“]”键,以匹配我向您展示的特殊字符,以便当人们用我们的母语阿尔巴尼亚语写信时,重新映射键。