如何在SendKeys中发送“ {}”

时间:2019-01-24 14:04:40

标签: c# winforms

我正在尝试使用SendKeys.Send()发送“ {”和“}”

我已经尝试使用string.Replace{"{", "{{}"}

txt = txt.Replace("{", "{{}");
txt = txt.Replace("}", "{}}");
SendKeys.Send(txt);

我希望它发送“ {”和“}”,但是程序抛出错误

  

System.FormatException

4 个答案:

答案 0 :(得分:3)

official docs

上有明确记录

以下是相关位:

  

加号(+),脱字号(^),百分号(%),代字号(〜)和   括号()对SendKeys具有特殊含义。指定以下一项   这些字符,将其括在大括号({})中。例如,   指定加号,使用“ {+}”。 要指定大括号字符,请使用   “ {{}”和“ {}}” 。方括号([])对SendKeys没有特殊含义,   但是您必须将它们用大括号括起来。

解决方案的问题是您要进行2次单独的替换。

采用输入字符串“ {”。

txt = txt.Replace("{", "{{}"); // input becomes "{{}"
txt = txt.Replace("}", "{}}"); // input becomes "{{{}}"
SendKeys.Send(txt);            // error!

我敢肯定,有比这更优雅的解决方案,但是您可以尝试以下方法:

var sb = new StringBuilder(txt.Length);
for(var i = 0; i < txt.Length; i++)
{
    var c = txt[i];
    switch (c)
    {
      case '+':
      case '^':
      case '%':
      case '~':
      case '(':
      case ')':
      case '{':
      case '}':
        sb.Append('{');
        sb.Append(c);
        sb.Append('}');
        break;
      default:
        sb.Append(c);
        break;
    }
}
SendKeys.Send(sb.ToString());

编辑通过开关和for扩展了转义,以说明其他可转义的字符。

答案 1 :(得分:1)

就像其他人指出的那样,您的第二个Replace将替换您的第一个Replace添加的花括号。

要转义字符串中的花括号,可以使用Regex,如下所示: SendKeys.Send(Regex.Replace(txt, @"[/{/}]", m => string.Format("{{{0}}}", m.Value)));

或者甚至更好地转义所有在此上下文中具有特殊含义的字符,即。 Regex.Replace(txt, @"[/{/}/+/%/~/(/)]", m => string.Format("{{{0}}}", m.Value))

另一种完全不同的选择是一次发送一个字符,并在必要时转义大括号:

"some{}text".ToCharArray().ToList()
   .ForEach(a=> SendKeys.Send(a == '}' || a == '{' ? "{"+a+"}": a.ToString()));

答案 2 :(得分:1)

我会使用其他变量来保存整个字符串:

root@a35defb4cad9:/opt/spark/dist# python --version
Python 2.7.6

答案 3 :(得分:-1)

{必须由{{}转义。 }必须被{}}转义。企图逃脱...

// NON-WORKING EXAMPLE!
txt = txt.Replace("{", "{{}");
txt = txt.Replace("}", "{}}");

...有问题,第一次替换引入的右括号再次被第二次替换掉。因此,从{开始,您会得到

{  -->  {{}  -->  {{{}}

这是错误的。为避免转义括号完全逃脱,请在第一个“替换”中为闭合的逃生括号使用替代字符。例如。一些中文字符,假设您永远不想发送此字符。

txt = txt.Replace("{", "{{閉");
txt = txt.Replace("}", "{}}");
// After having done the escape, replace the surrogate by the closing brace again.
txt = txt.Replace("閉", "}");

如果不确定是否将永远不会发送单个字符,请使用不太可能的字符序列作为替代,可能来自閉©ξ(中文,拉丁标点,希腊文)等不同字母。