티스토리 뷰

728x90

키보드가 없는 임베디드 시스템이나 터치스크린 시스템에서 키 입력을 받는 방법은 크게 두 가지가 있습니다. 하나는 윈도 시스템에 내장되어 있는 가상 키보드 어플을 동작시키는 것으로 외부 프로세스로 osk.exe를 실행시키는 방법입니다. 다음과 같은 코드로 간단하게 수행시킬 수 있습니다.

                Process p = new Process();

                p.StartInfo.FileName = "C:\\Windows\\System32\\osk.exe";
                p.StartInfo.Arguments = null;

                p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

                p.Start();

 

두 번째 방법은 WinForm 내에 자체적인 가상 키보드를 내장시키는 것으로 가상 키보드를 직접 제작하는 방법입니다. 원리는 여러 개의 TextBox로 이루어진 입력 항목들에 마우스 클릭 또는 터치로 포커스가 잡히면 textBox1_Enter() 같은 이벤트가 발생하는데 이때 현재 입력하려는 텍스트 박스가 무엇인지 다음과 같은 코드처럼 컨트롤을 저장해 둡니다.

        private void textBox1_Enter(object sender, EventArgs e)
        {
            focusedCtl = sender as Control;
        }

다음에 할 작업은 나름의 가상 키보드를 버튼이나 나름의 원하는 방식으로 제작합니다.

저의 경우에는 숫자와 소숫점, 그리고 백스페이스로 지우기만 지원하는 형태로 제작했습니다. 가상 키보드의 버튼들을 제작했으면 모든 버튼의 _Click 이벤트를 처리할 코드를 다음과 같이 작성합니다.

        private void numbtn_Click(object sender, EventArgs e)
        {
            Button padKey = sender as Button;

            string input = padKey.Text;

            if (focusedCtl == null) 
            { 
                Console.Beep(); 
                return; 
            }

            TextBox tb = focusedCtl as TextBox;
            int sstart = tb.SelectionStart;
            if (input == "←")
            {
                if (sstart > 0)
                {
                    string tmp = "";

                    if (sstart > 0)
                        tmp = tb.Text.Substring(0, sstart - 1);
                    if (sstart < tb.Text.Length)
                        tmp += tb.Text.Substring(sstart);
                    tb.Text = tmp;
                    sstart--;
                    tb.SelectionStart = sstart;
                }
            }
            else
            {
                tb.Text = tb.Text.Insert(sstart, input);
                tb.SelectionStart = sstart + input.Length;
            }
            tb.Focus();
        }

코드 내용을 간단히 살펴보면 우선 어떤 컨트롤이 편집중인지 확인하여 앞서 텍스트 박스에 포커스가 잡혔을 때 저장해둔 컨트롤이 없다면 처리 루틴을 종료하고 텍스트 박스 컨트롤을 확인했으면 현재의 커서 위치와 버튼의 텍스트로 입력 문자를 가져옵니다. 커서 위치에 따라 백스페이스인 경우에는 지우기 처리를, 다른 문자인 경우에는 문자 삽입 처리를 하고 해당 텍스트 박스에 포커스를 돌려주는 것으로 마무리합니다.

 

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함