Как отправить "{}" в SendKeys - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь отправить "{" и "}", используя SendKeys.Send()

Я уже пытался использовать string.Replace{"{", "{{}"}

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

Я ожидал, что он отправит "{" и "}", но Программа выдает ошибку

System.FormatException

Ответы [ 4 ]

0 голосов
/ 24 января 2019

{ должен быть экранирован на {{}. } должен быть экранирован {}}. Эта попытка сбежать ...

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

... проблема в том, что правые скобки, введенные первой заменой, снова сбрасываются второй заменой. Итак, начиная с { вы получите

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

что не так. Чтобы избежать экранирующих скобок, вводимых именно как экранированные, используйте суррогатный символ для закрывающей escape-скобки в первой замене. Например. какой-нибудь китайский символ , предполагая, что вы никогда не захотите отправить этот символ.

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

Если вы не уверены, что один символ никогда не будет отправлен, используйте невероятную последовательность символов в качестве суррогата, возможно, из разных алфавитов, таких как 閉©ξ (китайский, латинская пунктуация, греческий).

0 голосов
/ 24 января 2019

Я бы сделал это, используя другую переменную для хранения всей строки:

var txt = "asdf{}Asdf";
            var newString = new StringBuilder();
            for (int i = 0; i < txt.Length; i++)
            {
                if (txt[i] == '{')
                    newString.Append("{{}");
                else if(txt[i] == '}')
                    newString.Append("{}}");
                else
                    newString.Append(txt[i]);
            } 
            SendKeys.Send(newString.ToString());
0 голосов
/ 24 января 2019

Это довольно четко задокументировано на официальных документах

Здесь соответствующий бит:

Знак плюс (+), каретка (^), знак процента (%), тильда (~) и Скобки () имеют специальные значения для 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());

Редактировать продлил экранирование с помощью переключателя и для учета других экранируемых символов.

0 голосов
/ 24 января 2019

Как уже указывали другие ваши вторые 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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...