Windows Mobile 上使用鍵盤鉤子

 

使用時,只需實例化Hook類的一個實例,然後調用start()安裝鉤子,stop()拆除鉤子.

Hook hk = new Hook();

   hk.start();

hk.stop();

//--------------全局鍵盤鉤子類Hook------------------

using System;

using System.Linq;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace SmartDeviceProject1

{

    public class Hook
    {

        public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);

        private HookKeyProc hookKeyDeleg;

        public Hook()

        { }

        #region public methods

        //安裝鉤子

        public void Start()

        {

            if (hHookKey != 0)

            {

                //Unhook the previouse one

                this.Stop();

            }

            hookKeyDeleg = new HookKeyProc(HookKeyProcedure);

            hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);

            if (hHookKey == 0)
            {

                throw new SystemException("Failed acquiring of the hook.");

            }

        }

        //拆除鉤子

        public void Stop()

        {

            UnhookWindowsHookEx(hHookKey);

        }

        #endregion

        #region protected and private methods

        private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam)

        {

            KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));

            if (code < 0)

                return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);

            if (hookStruct.vkCode == 0x5B)

            {

                //如果捕捉到VK_LWIN按鍵

                //......處理......             

                return -1; //返回-1表示已經處理了,不再往下傳遞
            }

            if (hookStruct.vkCode == 0x25)

            {

                //如果捕捉到VK_LEFT按鍵

                //......處理......

                 return -1;  

            } 

            // 沒處理的鍵的消息往下傳遞
            return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);

        }

        #endregion

        #region P/Invoke declarations

        [DllImport("coredll.dll")]

        private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m);

        //private static extern int SetWindowsHookEx(int type, HookMouseProc HookMouseProc, IntPtr hInstance, int m);

        [DllImport("coredll.dll")]

        private static extern IntPtr GetModuleHandle(string mod);

        [DllImport("coredll.dll")]

        private static extern int CallNextHookEx(

                HookKeyProc hhk,

                int nCode,

                IntPtr wParam,

                IntPtr lParam

                );

        [DllImport("coredll.dll")]

        private static extern int GetCurrentThreadId();

        [DllImport("coredll.dll", SetLastError = true)]

        private static extern int UnhookWindowsHookEx(int idHook);

        private struct KBDLLHOOKSTRUCT
        {

            public int vkCode;

            public int scanCode;

            public int flags;

            public int time;

            public IntPtr dwExtraInfo;

        }

        const int WH_KEYBOARD_LL = 20;

        public class KeyBoardInfo

        {

            public int vkCode;

            public int scanCode;

            public int flags;

            public int time;

        }

        #endregion

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章