CHashtag

[C#] SendKeys.Send() ArgumentException 문자열이 잘못되었습니다. 해결방법 본문

C#

[C#] SendKeys.Send() ArgumentException 문자열이 잘못되었습니다. 해결방법

HyoSeong 2022. 11. 30. 12:26
반응형

안녕하세요.

 

오늘은 SendKeys 클래스의 Send, SendWait을 사용할 때 빈번하게 발생하는 ArgumentException에 대해 알아보도록 하겠습니다.

 

발생 원인

원인을 알기 위해선 Send()함수의 사용방법에 대해 짚고넘어가야 합니다.

KeyBoard Simulation을 하기 위해서는 일반적인 Key(문자열, 숫자, 특수문자) 외에도 필요한 값들이 존재합니다.

ESC, BREAK, BACKSPACE, Ctrl등이 해당되죠.

 

그렇다면 ESC를 입력하기 위해선 어떻게 해야할까요?

 

해당 방법은 MS에서 미리 정의해 두었습니다.

이런식으로 특수 케이스를 정의하여 해당 문자열을 넣으면 해당 Key가 눌리도록 구현이 되어있습니다.

BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
BREAK {BREAK}

 

SHIFT +
CTRL ^
ALT %

 

그렇다면 {, +, ^ 등의 예약문자들은 어떻게 입력해야 할까요?

Ctrl을 입력하고 싶은게 아니라, 정말로 + 가 입력하고 싶을때 말이죠.

 

당연스럽게도, 이부분 또한 MS에서 정의를 해두었습니다.

 

The plus sign (+), caret (^), percent sign (%), tilde (~), and parentheses () have special meanings to 
SendKeys
. To specify one of these characters, enclose it within braces ({}). For example, to specify the plus sign, use "{+}". To specify brace characters, use "{{}" and "{}}". Brackets ([ ]) have no special meaning to 
SendKeys
, but you must enclose them in braces. In other applications, brackets do have a special meaning that might be significant when dynamic data exchange (DDE) occurs.

+, ^ %, { 등의 키를 입력할 때에는, 중괄호로 묶어서 보내야 한다고 말이죠.

+ 를 입력하고 싶을 때에는 {+}로, { 를 입력하고 싶을 떄에는 {{} 로 말이죠.

 

간단히 예제로 알아보겠습니다.

using System.Windows.Forms;

SendKeys.Send("(");
// X

SendKeys.Send ("{(}");
// OK

 

해결방법

Regex를 이용하여 간단히 해결해 보겠습니다.

 

SendKeys.SendWait(Regex.Replace(str, "[+^%~(){}\\[\\]]", "{$0}"));

+^%~()[] 의 특수문자에 대해, 중괄호로 감싸도록 하는 Regex.Replace를 이용하여 문제를 해결할 수 있습니다.

 

다만 이부분은 {BREAK} 등이 사용되지 않았다는 전제가 존재하므로, 해당 기능을 사용하실 때 유의하시기 바랍니다.

 

 

 

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys?view=windowsdesktop-7.0&viewFallbackFrom=net-7.0 

 

SendKeys Class (System.Windows.Forms)

Provides methods for sending keystrokes to an application.

learn.microsoft.com

 

반응형