지난 1주일간(그리고 가장 intense했던 어제) 화상 키보드의 일종이라고 할 수 있는 Compass를 만들면서
너무도 많은 인터넷 문건의 도움을 받아 완성시킬 수 있었던 고로
왠지 나도 대단치 않지만 다음 사람에게 도움이 되도록 제작 노트를 남기고 싶었습니다.
개발 언어는 C#입니다.
Compass는 화면 위의 어떤 영역(반투명한 빨간 버튼으로 표시)을 클릭하여 입력 세션을 시작하고
이후 이어지는 일련의 마우스 커서 움직임을 통해 입력될 문자를 정합니다.
바로 앞 포스트에서 그린 것과 같이, 사용자는 어떤 단계에서 2~5가지 방향 중의 하나를 선택할 수 있고
선택된 방향에서는 미리 입력된 트리 구조를 따라 다음 선택지를 불러옵니다.
현재 짜여진 트리에서는 Consonants -> Sibilant로 가면 T, C, Z가 있는 식이죠
말로 설명하려니까 어렵네요 -_-
여기서 필요한 기능은
입력하지 않을 때 방해가 되지 않도록, 그리고 외관을 위해 폼을 알파블렌딩하는 기능과
입력이 시작되었을 때 마우스 움직임이 영역을 벗어나도 따라갈 수 있는 후킹
그리고 결정된 문자를 입력하는 키보드 메세지 보내기로 나눌 수 있겠습니다.
알파블렌딩은 http://www.codeproject.com/KB/GDI-plus/perpxalpha_sharp.aspx 의 예제를 썼습니다.
기본 정의된 Form을 상속받아 PerPixelAlphaForm 클래스를 정의한 예제로
PNG를 넣어 주면 그 모양 그대로 폼을 만들어 줍니다. 잘은 모르지만 C++ DLL을 쓰는 모양입니다.
Compass에 적용하자면 다음 단계로 넘어갈 때마다 새 그림을 그려주고 글자를 찍으면 되지요. 그림은 포토샵으로 미리 그린겁니다.
글자는 PNG에서 받아온 Bitmap객체에서 Graphics를 만든 다음
Graphics tmpGraphic = Graphics.FromImage(tmpBitmap);
DrawString으로 글자를 찍어서 Bitmap 자체를 수정, PerPixelAlphaForm의 SetBitmap에 넘겨줍니다.
글로벌 후킹은 http://blogs.msdn.com/toub/archive/2006/05/03/589468.aspx 을 참고했습니다. WH_MOUSE_LL메세지를 받습니다.
키보드 메세지는 http://www.pinvoke.net/default.aspx/user32/SendInput.html 에서 설명하는 SendInput함수를 씁니다. 여기서 정의된 INPUT구조체의 ki.wVk에 Virtual Keycode를 넣어서 날리면 됩니다.
죽 긁어와서 붙인 꼴이라 뭐라 설명하기도 민망하군요. 두 예제 모두 찾을 수 있는 최선이었다고 생각합니다.
keybd_event는 써보지 않아서 어떤지 모르겠지만 SendInput의 경우 한/영키를 누르고 A를 입력하면 ㅁ이 출력되는... 뭐 그렇습니다. 아래아한글에서도 잘 되네요
이번 삽질의 핵심이 되는 부분이자 이 글을 쓰기로 마음먹게 된 동기인
osk개발에서 문제가 되는 포커스 문제는
폼의 클라이언트 영역을 0으로 만들고 글로벌 후킹으로 입력을 받아서 해결했습니다.
Constructor에 다음과 같이 써주면 됩니다
this.ClientSize = new Size(0, 0);
그리고 this.TopMost = true; 로 설정하면 아래에 있는 윈도우에 전혀 영향을 주지 않으면서
필요한 영역에서 일어나는 이벤트만 포커스 변경 없이 처리할 수 있지요
폼 영역에서 클릭을 받았을 때, 그리고 입력 도중에 들어오는 마우스 메세지는
여기서 처리한 다음 넘기지 않습니다. 콜백 함수에서 return (IntPtr)1;
아마 MS의 osk도 이런 방식이 아닐까 생각해봅니다 'ㅅ'
아이디어 자체의 구현은 XNA를 사용하니 3시간만에 끝났지만
실제로 쓸 수 있게 만드는 게 1주일이나 잡아먹었군요.
이 글이 조금이나마 또 다른 삽질을 줄일 수 있기를 희망합니다.
Trackback Address :: http://mysanal.net/tc/trackback/100


예아 콤패스핀
콤패스는 어느나라 발음이빈까?
누가 요약좀
잘했음 칭찬좀 ^^
이런뜻임
아 나도 프로그래밍 잘하고싶다
믿는게 이거밖에 없는 것도 초큼 처절하지 말입져
시-벌
믿는게 없는 사람은 어찌해야함?
나도 몰러 'ㅅ' 근데 횽이 걱정할 일은 아닌듯
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
후... 마약이라도 하면 편해질거같다...
약 빨고 살 바에야 죽는게 나음 'ㅅ' 객관적으로
let'sdie?
난 아직;;
3줄요약
콤
파
스
물
파
스
그냥
우왕ㅋ굳ㅋ 수고했삼
ㄳㄳ =ㅅ=
우왕굳수고했서여
osk개발은... 오승규 개발잉미.
ㅇㅇ 천직일지도(<-)