我正在使用C#SendKeys.Send方法运行一个问题。我试图用其他键替换键盘键,例如当我在键盘上按“a”时,我希望该键为“s”,例如,当我在我的代码中执行此操作时:
if ((Keys)keyCode== Keys.A)
{
SendKeys.Send("s");
}
现在我的记事本中只打印了“sa”字符,但是在这种情况下我不需要打印“sa”而只需要“s”字符,因为当我按下键盘上的“a”时,“a”必须用“s”代替。
我尝试通过添加以下行删除最后一个字符:
SendKeys.Send("{BS}");
但我得到的只是“s”字符被删除,而“a”字符就在那里。
如何防止这种情况发生?
答案 0 :(得分:2)
我会改变我的电话:
SendKeys.Send("{BS}");
SendKeys.Send("S");
编辑(问题更新后):
如果您正在处理字符串(对于您的特殊字符),您是否可以捕获按键生成的字符串(“a”)并通过将字符串设置为字符的unicode值来修改它'试图代表?如果人们提到的其他解决方案不起作用,那就是我接下来要尝试的地方......
答案 1 :(得分: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");
}
}
或者,如果这不仅仅用于文本框,那么你不能只是反转你的退格键和密钥发送吗?
if ((Keys)keyCode== Keys.A)
{
SendKeys.Send("{BS}"); // remove A
SendKeys.Send("s"); // add S
}
答案 2 :(得分:2)
另一个选择是使用低级键盘钩子来捕获旧角色,然后发送新角色。它需要一些P / Invoke,但它使您能够完全捕获原始密钥,以便应用程序甚至看不到它。
答案 3 :(得分:1)
我打印“a”因为退格是 在“s”之后立即发送它 删除“s”字符。我怎么能够 防止这种情况发生?
呃.....
发送s后不立即发送退格?
if ((Keys)keyCode== Keys.A)
{
Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
SendKeys.Send("s"); // Sends the "S"
}
答案 4 :(得分:1)
SendKeys.SendWait
答案 5 :(得分:1)
这可能不是您想要/需要的,但如果您只想重新映射一些键盘键,我建议您使用其他键盘布局或创建自定义布局。您可以使用以下方法创建新布局:
答案 6 :(得分:1)
我认为SendKeys.Send("{BS}");
方法永远不会有效(按任意顺序)。这是因为在SendKeys.Send
发布后处理原始的按键/键释放事件。我认为在目标窗口过程(例如记事本)处理之前,您应该以某种方式取消要删除的字符的按键/键入事件。
答案 7 :(得分:0)
您是否尝试使用.Send({BS})
切换.Send("s")
?否则,你能澄清一下吗?
答案 8 :(得分:0)
我通过注册全局热键解决了这个问题。谢谢。 This是我用来解决问题的资源。