使用SendKeys发送特殊字符

12

我正在使用文本框通过SendKeys发送文本,但当我在文本框中插入特殊字符时,我的应用程序会崩溃。例如,当我在文本框中输入'+'时,就会出现以下错误:SendKeys字符串“+”无效。

我需要解决方案来通过SendKeys发送特殊字符,这是我的代码的一部分:

SendKeys.Send(dropDownEffectsLeft1.SelectedItem.ToString() + dropDownEffectsRight1.SelectedItem.ToString() + txt1.Text);

关键在于名为txt1的文本框。

我认为我需要像Regex这样的东西来检查我的txt是否包含任何特殊字符,我将使用以下代码进行操作:

Regex specialChar = new Regex(@"^[a-zA-Z0-9_@.-]*$");

我非常感激您的帮助。

2个回答

26

根据MSDN SendKeys的介绍:

加号(+)、插入符号(^)、百分号(%)、波浪号(~)和括号(())在SendKeys中有特殊含义。要指定这些字符,请使用大括号({})将其括起来。例如,要指定加号,使用“{+}”。要指定大括号,请使用“{{}}”和“{}}”。方括号([])在SendKeys中没有特殊含义,但必须将其括在大括号中。在其他应用程序中,方括号可能具有特殊含义,并且在动态数据交换(DDE)发生时可能具有重要意义。

代码

因此,您只需要使用正则表达式替换这些字符:

string txt = Regex.Replace(txt1.Text, "[+^%~()]", "{$0}");
SendKeys.Send(txt);

测试

我测试了这段代码,并且我有一个在线测试,你可以检查一下正则表达式[+^%~()]

  • 输入:加号 +、脱字符 ^、百分号 %、波浪号 ~、括号 ( )
  • 输出:加号 {+}、脱字符 {^}、百分号 {%}、波浪号 {~}、括号 {(} {)}

是的,我也尝试过使用foreach和for循环。但是没有成功。但看起来这个解决方案可以工作,但为什么你在{ }之间使用$0? - Swag
$0 插入匹配的字符。 - Daniel Gimenez
太棒了!不需要使用Foreach和For循环 :) 非常感谢。 - Swag
好的回答~!{$0} 的意思是“用{ }包围字符串”。 - Lin
7
大括号本身也必须被转义,因此请使用这个正则表达式:"[+^%~()\\{\\}]" - NineBerry

1

我发现还有一个需要转义的特殊字符 - ~(波浪线)。我创建了一个包含所有低 ASCII 和高 ASCII 的文本文件,并使用以下代码处理该文本:

              foreach (char c in pString) {
                 if (c.ToString() == "(")
                    SendKeys.SendWait("{(}");
                 else if (c.ToString() == ")")
                    SendKeys.SendWait("{)}");
                 else if (c.ToString() == "^")
                    SendKeys.SendWait("{^}");
                 else if (c.ToString() == "+")
                    SendKeys.SendWait("{+}");
                 else if (c.ToString() == "%")
                    SendKeys.SendWait("{%}");
                 else if (c.ToString() == "~")
                    SendKeys.SendWait("{~}");
                 else if (c.ToString() == "{")
                    SendKeys.SendWait("{{}");
                 else if (c.ToString() == "}")
                    SendKeys.SendWait("{}}");
                 else
                    SendKeys.SendWait(c.ToString());
              }

这里是测试文本:

快速的棕色狐狸跳过懒狗123-456-7890。快速的棕色狗:跳过了;懒狗!狗跳了吗?价值约为~200+-,那是一个破折号!当然,在小写字母下面有一个奇怪的符号 - 波浪号 `. [这是脚注] 但我想不出一个{花括号}的借口。当然,我们知道左圆括号和右圆括号都不能被忽略。我们需要给edgar@something.com发送电子邮件,让他给我发送1美元,这大约是实际价值的50%。显然,有3个修饰符将失败:^插入符号; +加号; %百分号;。我们还需要查看&号、*(星号)和_下划线; 然后是=等号和:冒号。如果我们在句子中间插入一个制表符会发生什么?然后当然我们可以有|竖杠或\反斜杠,更不用说/正斜杠了。 上述是一行,后面跟着一个新行开始句子。好的,我错过了什么#井号

接下来的段落说明,在上一个话语之后开始了一个新段落。除此之外,还有在上述内容之后的不可思议的大量石蜡,它至少是“低ASCII”——涵盖了开放和闭合引号,但不包括“卷曲”的引号——即撇号。当然,还有“高ASCII”: €,ƒ,„,…,†,‡,ˆ,‰,Š,‹,Œ,Ž,‘,’,“,” ,•,–,—,˜,™,š,›,œ,ž,Ÿ,¡,¢,£,¤,¥,¦,§,¨,©,ª,«,¬,­,® ¯,°,±,²,³,´,µ,¶,·,¸,¹,º,»,¼,½,¾,¿,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,× Ø,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ 更不用说成千上万个Unicode字符了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接