마우스 앞으로/뒤로 버튼과 키보드 미디어키 감지하기

로지텍 무선 태양광 K750

로지텍 무선 태양광 K750

요즘 나오는 마우스들 대부분에는 미디어 키가 추가되어 있습니다. 키보드 상단에 하드웨어 키가 따로 있는 경우도 있고, 오른쪽 사진의 제 키보드처럼 펑션키의 조합인 경우도 있는데요. 보통은 볼륨 업/다운, 다음곡/이전곡 이런 기능들이 연결되어 있지요.

또 요즘엔 마우스에도 웹브라우저의 앞으로, 뒤로튼이 추가되어 있는 경우가 많습니다. 저도 이 버튼 기능을 최근에야 쓰기 시작했는데, 한번 맛들이니 아주아주 편리하더군요. ^^

그럼, 델파이나 C++빌더 애플리케이션에서 이들 버튼과 키 동작을 감지할 수는 없을까요? 제 경우엔, 마우스의 앞으로/뒤로 버튼을 페이지컨트롤의 앞 페이지, 뒤 페이지 이런 기능에 연결하고 싶었습니다.

로지텍 무선 마우스 LX8

로지텍 무선 마우스 LX8

이런 특수 키, 버튼의 감지는 생각보다 아주 간단합니다. WM_APPCOMMAND라는 메시지를 검출하면 되는데요. 키가 눌려진 순간 현재 활성화된 프로그램으로 이 메시지가 날아옵니다. 따라서 메시지 핸들러 함수를만들고 이 메시지를 검출하면 됩니다.

이 WM_APPCOMMAND 메시지의 lParam을 GET_APPCOMMAND_LPARAM()이라는 API 함수로 걸러내면 어떤 키보드 키나 마우스 버튼이 눌려졌는지 알아낼 수 있습니다.

또 lParam을 GET_DEVICE_LPARAM() 함수로 거르면 어떤 디바이스(마우스/키보드/제3의 디바이스)에서 이벤트가 발생했는지 알 수 있지요. GET_KEYSTATE_LPARAM() 함수를 쓰면 해당 버튼/키가 눌린 순간에 컨트롤키나 마우스의 다른 버튼이 눌려진 상태인지도 알아낼 수 있습니다.

간단한 예제를 보지요. 아래는 델파이 예제입니다.

 

C++빌더 버전의 예제는 아래와 같습니다.

 

(델파이 코드에서 가장 아래의 inherited를 없애버릴 경우, 기본 동작이 막히게 됩니다.)

위 코드를 실제로 실행해보시면 아시겠지만, 이 코드를 활용하면 애플리케이션에서 볼륨 업다운이나 트랙 앞/뒤 등의 키보드 동작이 발생할 때 애플리케이션에서 특정 동작으로 연결할 수 있습니다. 예를 들자면, MDI 애플리케이션에서 여러 차일드 창을 열어놨을 때, 트랙 앞/뒤 키를 누르면 다음 창, 이전 창 이렇게 이동하게 할 수 있게 되지요.

위에서 나열한 키는 모두는 아니고 제 마우스와 키보드에 있는 것들만 추린 거구요. 전체 리스트를 보시려면 MSDN의 WM_APPCOMMAND 메시지에 대한 설명 페이지에서 보실 수 있습니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646275(v=vs.85).aspx

1 comment for “마우스 앞으로/뒤로 버튼과 키보드 미디어키 감지하기

답글 남기기

이메일 주소는 공개되지 않습니다.