가상 키보드(화면 키보드)란??
화면에 키보드 형상을 그리고 그걸 클릭해서 실제 키보드를 타이핑하는것과 똑같은 효과를 얻기 위한 프로그램. 키보드가 없는 터치패널 시스템과 같이 키보드를 쓰기 어려운 상황에서 사용된다.
기술적 어려움
- 마우스 입력 후킹해서 키보드 입력메시지를 보내야 함.
- 키보드의 키 입력 상태(IME의 상태 CAPS_LOCK, NUM_LOCK 등등) 감시하고 있어야 함.
- 가상키보드의 자판을 클릭 시에도 원래의 애플리케이션에 포커스가 머물러 있어야 함
- WH_MOUSE로 후킹을 하게 되면 마우스 입력을 취소시키더라도 포커스가 변경이 되어버리는 문제가 있다. 즉 후킹 전에 이미 포커스 이동 명령이 나가 버린다는 점. 따라서, 이를 방지하고자 메시지 후킹을 해야 할까 생각했지만, 다행히도 윈도우 2000 버전 이후에 추가된 WH_MOUSE_LL이라는 녀석이 있다.
- 이 녀석은 마우스 입력이 들어가자마자 가로채 버린다. 근원적으로 마우스의 입력을 막을 수 있다는 뜻이다. 또한, 애초에 포커스가 이동하지 않기 때문에 한글 조합도 신경을 쓸 필요가 없다. 물론 윈도 2000 버전부터 지원한다는 것이 꺼림칙하긴 하지만, 늘보가 만드는 프로그램은 언제나 윈도 2000 이상을 요구하므로, 별 상관이 없다 -_-;
- 사실 델파이 7에는 WH_MOUSE_LL 가 정의되어 있지 않기 때문에 전혀 모르고 있었는데, 도움말 파일을 뒤적거리다가 우연히 발견했다. 문제는 WH_MOUSE_LL 이게 값이 얼마 인지 알 수가 없어서 WH_MOUSE_LL = 14 라는 걸 찾으려고 구글을 이용할 수밖에 없었다.
- 기타 IME 및 키보드의 상태 감시는 소스가 첨부되어 있고 검색하기도 쉽기 때문에 넘어가야겠다. (사실은 얼른 집에 가야 함 -_-;)
- 포커스된 윈도우에 메시지를 보내는 방식을 쓰지 않고 keybd_event 를 사용했다. 이게 코딩하기 쉽기 때문이다 (귀찮은 걸 싫어하는 늘보임 -_-;)
예제 프로그램과 소스
- 원본 프로그램은 키보드의 모든 기능을 집어넣었지만, 여기선 일부만 빌려서 넷핵 플레이용 키보드를 만들었다. NUM 키 누르기가 영 불편하기에 만든 것이다.
- 그런데, 만들고 나서는 별로 쓰지는 않고 있다...;
- 혹시라도 이걸 사용할 곳이 있다면 출처를 밝히고 마음껏 쓰시라.
- 원본 프로그램에 개인적인 잡다한 라이브러리가 많아서 그걸 삭제하고 다시 컴파일하여 올린다.
예제 실행 프로그램 + 소스