c#-全局键盘钩子

来源:互联网 发布:初中视频讲课软件 编辑:程序博客网 时间:2024/06/05 19:23
using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;namespace WebClick_Tool{    public class KeyPress_o    {        [StructLayout(LayoutKind.Sequential)]        public class KeyBoardHookStruct        {            public int vkCode;            public int scanCode;            public int flags;            public int time;            public int dwExtraInfo;        }        //委托         public delegate int HookProc(int nCode, int wParam, IntPtr lParam);        static int hHook = 0;        public const int WH_KEYBOARD_LL = 13;        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。         static HookProc KeyBoardHookProcedure;        //设置钩子         [DllImport("user32.dll")]        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        //抽掉钩子         public static extern bool UnhookWindowsHookEx(int idHook);        [DllImport("user32.dll")]        //调用下一个钩子         public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);        [DllImport("kernel32.dll")]        public static extern int GetCurrentThreadId();        [DllImport("kernel32.dll")]        public static extern IntPtr GetModuleHandle(string name);        public static void Hook_Start()        {            if (hHook == 0)            {                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);                //如果设置钩子失败.                 if (hHook == 0)                {                    Hook_Clear();                }            }        }        /// <summary>        /// 取消钩子事件        /// </summary>        public static void Hook_Clear()        {            bool retKeyboard = true;            if (hHook != 0)            {                retKeyboard = UnhookWindowsHookEx(hHook);                hHook = 0;            }        }        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)        {            if (nCode >= 0)            {                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                Keys k = (Keys)Enum.Parse(typeof(Keys), kbh.vkCode.ToString());                switch (k)                {                    case Keys.F2:                        if (kbh.flags == 0)                        {                            // 这里写按下后做什么事                            //Main.GB = true;                            MainForm.Fs(FormBorderStyle.FixedSingle);                            MainForm.StopAll = true;                            MainForm.DisMes("停止...");                            MainForm.Enb(true);                        }                        else if (kbh.flags == 128)                        {                            //放开后做什么事                        }                        return 1;                }            }            return CallNextHookEx(hHook, nCode, wParam, lParam);        }    }}

0 0
原创粉丝点击