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值来修改它代表什么? 如果人们提到的其他解决方案不起作用,那就是我接下来要尝试的地方……

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

我可能做了一个错误的假设,但如果你在文本框中使用它,你可以:

 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 } 

SendKeys.SendWait

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

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

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

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

嗯…..

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

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

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

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