5

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

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

}

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

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

SendKeys.Send("{BS}");

但是我得到的只是删除了“s”字符,并且存在“a”字符。

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

4

9 回答 9

2

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

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
}
于 2009-06-18T13:42:33.723 回答
2

我会撤销我的电话:

SendKeys.Send("{BS}");

SendKeys.Send("S");

编辑(问题更新后):

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

于 2009-06-18T13:36:45.433 回答
2

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

于 2009-06-18T14:06:54.080 回答
1

我打印了“a”,因为退格是在“s”之后立即发送的,它会删除“s”字符。我怎样才能防止这种情况发生?

嗯……

发送 s 后不要立即发送退格键?

if ((Keys)keyCode== Keys.A)
            {
                Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
                SendKeys.Send("s"); // Sends the "S"
            }
于 2009-06-18T13:34:20.883 回答
1

SendKeys.SendWait

于 2009-06-18T13:36:59.177 回答
1

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

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

于 2009-06-18T13:50:48.057 回答
1

我认为这种SendKeys.Send("{BS}");方法永远不会奏效(以任何一种顺序)。那是因为原始的按键/按键释放事件在SendKeys.Send发布后得到处理。我认为您应该在目标窗口过程(例如记事本)处理之前以某种方式取消要删除的字符的按键/按键事件。

于 2009-06-18T14:10:09.593 回答
0

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

于 2009-06-18T13:35:40.397 回答
0

我通过注册全局热键解决了这个问题。谢谢你。 是我用来解决问题的资源。

于 2009-06-18T22:37:19.393 回答