Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[5538] [답변] HS0608/ 입력키 알아내기???
박지훈.임프 [cbuilder] 1223 읽음    1999-01-16 16:29
안녕하세요. 천리안 프로그래머포럼 C++Builder 담당자 임펠리테리입니다.

얼마전에 제가 막혀서 헤맸던 부분이군요. 핫키처리... ^^

ime 입력모드가 한글상태일때는 도대체 어떤키가 눌렸는지 알아낼 방법이 없죠.

OnKeyPress에서 넘어오는 키값은 무슨 키를 누르든 모두 VK_Progress(229)

뿐이니까요.

제가 알아낸 해결책은 두가지 방법입니다.

먼저 알아낸 방법은, api 함수인 ImmGetCompositionString() 을 써서 현재 조합중인

키를 들고오는 겁니다. 사용법이 좀 복잡해서 간단히 어케 사용하면 원하는 결과를

얻는지만 보여드리죠.

ImmGetCompositionString(ImmGetContext(입력컨트롤의 핸들), GCS_COMPSTR,
    Buff, 3);

여기서 Buff는 문자의 배열.. 그러니까 델파이라면 PCHAR형으로 되어야 합니다.

(길이가 3 이상)

설명은 복잡하고.. 키값이 VK_Progress일때 위와 같이 해주면 눌려진 키값이 리턴

되어 넘어옵니다. (몇시간을 끙끙대면서 붙잡고 늘어져서 알아낸 겁니다.)

위 방법은 간단히 한줄로 눌려진 값을 알아낼 수 있어서 좋더군요.

근데.. 다 구현해놓고 좀 쉬려다가 보니 갑자기 또 다른 아이디어가 떠오르두만요.

이 방법은, 윈도우즈에 핫키로 등록하는 방법입니다. 그냥, 단순히 생각했습니다.

반드시 메뉴 핫키 말고도 핫키를 임의로 등록하는 방법이 있을거당.. 하고 추측을

한거죠. 그리고 찾아보니.. 있더군요. 근데 위의 방법보다는 좀 복잡해집니다.

개략적으로만 설명해보죠. 일단 핫키를 등록하는 함수는, RegisterHotKey() 였던가,

입니다. 인자는 금방 기억이 안나고.

이렇게 등록하고 난 후에는 그 키를 누를때마다 WM_HOTKEY 메시지가 발생하는데요.

그러니 당근 핫키메시지에 대한 핸들러를 작성해줘야죠. WParam과 LParam으로 키를

구별할 수 있습니다. 할당해준 ID나 혹은 키 값으로 직접 확인할 수 있죠.

근데 이 방법은.. 좀 멋있어보여서 끝까지 밀어붙이긴 했는디.. 단점이 있습니다.

(장점일수도... ^^)

이렇게 등록하는 핫키는, 메뉴의 숏컷처럼 어플리케이션에 국한되는 것이 아니라

윈도우즈에 전역적으로 선언되더군요! 참으로.. 꽈당이었습니다.

그러니까, 저같은 경우엔 아래아한글의 표기능을 구현하느라 알트 L, 알트 T,

C, M, L 등등의 핫키를 요란하게 등록을 해놨는데요. 이게.. 으...

프로그램이 일단 실행중일때는 실행된 어플을 백그라운드로 해놓고 ide가 활성화된

상태에서도 핫키가 먹더군요! 과연 핫키라는 이름에 걸맞게!

그럼 이걸 어케 써먹지요? 물론 이런 전역적인 핫키가 꼭 필요한 곳도 있지만,

적어도 제가 작성하는 프로그램에서는 막아야만 했죠. 그래서.. 전 또 잔머리를..

^^;;

WM_ACTIVATE 메시지에 핸들러를 달아주고, 어플이 비활성화될때마다 핫키를

해제한겁니다. 핫키해제는 Unregister~ 함수를 쓰면 되더군요.

(WM_ACTIVATEAPP 는 쓰면 안됩니다. 안되는 이유가 있죠. 흐흐...)

참, 명시적으로 이함수로 핫키를 해제하지 않으면 등록된 핫키는 자동해제가 안됩

니다. 그러니까 어플 종료후에도 핫키가 먹는다는 말이죠. 물론 핸들러함수는

없어서 아무런 일도 생기지 않지만, '아무런 일도 생기지 않는다'는 일이 생기죠.

다시말하면, 한번 등록한 핫키를 해제하지 않으면 앞으로 그 키는 죽어버려서,

다시는 쓸 수 없게 된다는 말이죠.

음.. 썰이 넘 길어졌네요. 두가지 방법중에 어떤 방법도 잘 먹습니다.

저는, 그래도 코드를 멋있게 만드는데 관심이 많아서, 두번째 방법을 썼습니다만

사실 오히려 코드는 훨 더 많아지더군요. (당연하겠죠)

그럼 참고하시길 바랍니다.




독립문에서 임펠리테리였습니다.

(cbuilder, cbuilder@thrunet.com)



+ -

관련 글 리스트
5538 [답변] HS0608/ 입력키 알아내기??? 박지훈.임프 1223 1999/01/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.