본문 바로가기

Mobile Develop/WinMoDev Q&A

옴니아1 하드웨어 버튼 차단

질문자 : 아기소나무 링크 : http://cafe.naver.com/winmodev/1926
<질문내용>

루나네스님의 글을 참고로 옴니아1에서 하드웨어 버튼의 입력을 임의로 처리하려고 합니다.

HookProc에서 키 값을 찍어보기 위한 코드를 넣었는데 작동을 안하는지 값이 나오지 않더군요.(에뮬레이터에서는 되나, 디바이스에서는

안되네요.)

버튼 입력도 기존처럼 작동하구요..

 

어떻게 하면 하드웨어 버튼을 차단할 수 있는지 알고 싶습니다.

----------------------------------------------------

원본 링크 : http://cafe.naver.com/winmodev/472

사용 예로는

메인 폼이 활성화 된 상태에서, +,- 버튼을 사용해서 화면을 확대/축소 등을 하려고 합니다.

에뮬레이터에서는 hook 설치가 정상적으로 되나, 디바이스에서는 hook 설치를 실패합니다.

 

최종적으로 사용하려는 하드웨어 버튼은 +,-,홈키 정도가 될것 같습니다.

 

환경은 옴니아1, 윈모6.1 입니다.

 

관련소스/참고자료

 

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("coredll.dll")/]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

        [DllImport("coredll.dll")]
        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

        public struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr dwExtraInfo;
        }

 

이 소스를 추가해 주시교요,,


        private readonly NativeMethods.HookProc HookProcedure;
        private readonly int hHook;

이 소스를 선언부에 선언 해 주시구,,

 

Form 클래스의 생성자 메소드에


            HookProcedure = KeyboardHookProc;
            hHook = NativeMethods.SetWindowsHookEx(20, HookProcedure, IntPtr.Zero, 0);

를 추가해 주세요

 


        private static int KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            NativeMethods.KBDLLHOOKSTRUCT hookStruct = (NativeMethods.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(NativeMethods.KBDLLHOOKSTRUCT));
            if (code >= 0)
            {
            }
            return 1;
        }

<답변내용>

안녕하세요 루나네스 입니다

 

어느시점에서 사용하시려는지는 잘 모르겠는데요 ^^;;

 

우선적으로 어떤 상태에서 어떤 하드웨어 키를 사용하고자 하시는 지에 대한 말씀이 빠지신 것 같네요

대부분의 하드웨어키 후킹 API를 사용하려면 프로세스가 동작하고 있는 시점에서 사용을 시작하게 됩니다

 

예를들어 Call버튼은 전화를 받기위한 것 이기때문에 최우선적으로 처리 해야 합니다
두번째, End버튼은 종료 이벤트를 발생시키는데, 이 때 단말기의 설정을 최우선으로 감지합니다

 

위의 내용처럼 옴니아1,2의 경우에는 단말기 종료 버튼 을 눌러 프로그램 종료 라는 옵션이 있습니다
이 옵션이 켜져 있는경우에는 종료가 되겠지만, 꺼져 있으면 프로그램이 최소화 된 상태로 대기하겠지요

 

이 부분에 대해서 처리를 하는 것이 중요한데요


우선 KeyboardHookProc()에서 hookStruct.vkCode 가 정상적으로 리턴되는지 확인해 주세요
특정값이 정상적으로 넘어온다면, (옴니아에서는 0x73이 종료키 입니다)
후킹이 정상적으로 동작하는 것 입니다

 

만약 값이 안넘어 온다면, 후킹 프로세스에서 실패한건데요.;

확답을 드리기 어렵네요


어떠한 상황에서 사용하시는지에 대해서 좀 더 자세하게 질문 올려주세요 :)

작성일 : 2010.04.02 20:08

보다 자세한 정보는 윈도우 폰/모바일 개발자 모임에서 만나보실 수 있습니다