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