【问题标题】:C# SendKeys.SendC# SendKeys.发送
【发布时间】:2010-11-03 23:59:09
【问题描述】:

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

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

}

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

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

SendKeys.Send("{BS}");

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

如何防止这种情况发生?

【问题讨论】:

  • 不,这是针对我被分配执行的项目。在我自己的语言中,我们有一些特殊字符“ë”和“ç”,我必须重新映射“[”和“]”键以匹配我向您展示的特殊字符,以便当人们写信给我们的母语阿尔巴尼亚语时重新映射键的语言。

标签: c# sendkeys


【解决方案1】:

我会撤销我的电话:

SendKeys.Send("{BS}");

SendKeys.Send("S");

编辑(问题更新后):

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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
      }
      

      【讨论】:

      • 请注意:我在原始问题更改为说明他正在使用记事本之前发布了此内容。
      • 我需要它是全局的,我正在使用 Windows Hooks 来获取按下的全局键。
      【解决方案4】:

      SendKeys.SendWait

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 非常感谢您的建议,但我需要以编程方式重新映射键盘布局。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          嗯.....

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-02-19
                相关资源
                最近更新 更多