상세 컨텐츠

본문 제목

C# 마지막 커서에 남아있는 문자 지우기

개발관련

by 프로왓칭맨 2020. 7. 17. 17:58

본문

요즘 삽질이 굉장히 많아진 것 같다

 

너무 간만에 Winform을 하다보니 그런가.. 얼른 WEB으로 넘어가야하는데..

 

이번 삽질은 저번에 한/영모드보다 더 오래 헤맨 끝에 해결할 수 있었는데 너무 간단히 해결되서 허무할 정도...

 

일단 문제는 TextBox 컨트롤에 입력된 값들을 모두 초기화하고 다시 TextBox가 있는 패널을 띄울 때 발생했다.

 

커서 겹침

이런식으로 TextBox에 입력한 상태에서 초기화가 되는 경우

(키오스크는 특정 시간동안 입력이 없을 경우 메인으로 띄어줘야 하기 때문)

 

다시 창을 띄었을때 키보드 버퍼가 남아있어서인지 뭔지 모르겠지만 TextBox에 ㅎ이 계속 남아있었다.

 

keybd_event()를 이용해 백스페이스도 먹여보고 Focus()를 다른데 줘보고 별짓 다해봤는데 어떤 꼼수도 통하지 않았다..

 

그렇게 모든 키워드를 다 쳐가서 머리를 짜내다가 결국 도움이 되는 걸 찾아냈다.

 

참조사이트:https://www.python2.net/questions-28884.htm

 

winforms (C #)에서 버튼을 부딪친 후 마지막 활성 입력 TextBox에 'SendKeys'하는 방법은 무엇입니까?

와이즈 비즈 방법  마지막 활성 입력 SendKeys  winforms (C #)에서 버튼을 클릭 한 후? C #을 처음 사용하고 화상 키보드로 winforms 응용 프로그램을 만들려고하는데 여러 개의 텍스트 상자가 있습니다.

www.python2.net

keybd_event()함수가 WinApi이기 때문에 분명히 버퍼에 들어있을 것 같다고 생각했는데 그게 맞았던 것 같다.

 

'SendKeys'를 이용해 간단하게 해결할 수 있었다.

 

Intelligence기능을 보니 SendKeys.Flush()가 있길래 초기화 함수에 한줄을 추가했더니 결국 제대로 초기화가 되었다.

 

초기화 함수 안에 백스페이스 입력 신호를 넣고 SendKeys.Flush()를 호출하니 입력신호가 처리되는 것 같다.

해결법은 아래처럼 간단하다.

 

//백스페이스 입력하기

keybd_event((byte)Keys.Back, 0, 0x00, 0);

keybd_event((byte)Keys.Back, 0, 0x02, 0);

//현재 메시지큐에 있는 모든 메시지 처리함수 

SendKeys.Flush();

 

그동안 keybd_event만 먹여도 잘만 들어가던게 꼭 필요할 땐 동작을 안하니 희안할 따름이다.

 

그리고 내가 생각한 구조라면 

//백스페이스 입력하기

keybd_event((byte)Keys.Back, 0, 0x00, 0);

keybd_event((byte)Keys.Back, 0, 0x02, 0);

//다른 값 입력하기 아래 값은 숫자 1

keybd_event((byte)Keys.D1, 0, 0x00, 0);

keybd_event((byte)Keys.D1, 0, 0x02, 0);

//현재 메시지큐에 있는 모든 메시지 처리함수 

SendKeys.Flush();

 

이렇게 하면 TextBox에 1이 생겨야 할 것 같은데 아무것도 안남는다. 그렇다고 SendKeys.Flush()만 사용해서 사라지는 것도 아니고... 원인은 모르고 해결만 한 것 같은데 원인을 아시는 분은 댓글로 알려주시면 감사하겠습니다

 

결국 혼자 개발하려니 삽질은 길고 해결은 참 허무하다

 

 

관련글 더보기

댓글 영역