首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

一段大局键盘钩子, 为什么实例化后不管用了,待高手帮忙

2012-09-14 
一段全局键盘钩子, 为什么实例化后不管用了,待高手帮忙C# codeusing Systemusing System.Collections.Gen

一段全局键盘钩子, 为什么实例化后不管用了,待高手帮忙

C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection;using System.Diagnostics;namespace WindowsFormsApplication1{    /// <summary>      /// Description of MainForm.      /// </summary>      public partial class KeyHook    {        //委托          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会在你截取之前获得键盘。          HookProc KeyBoardHookProcedure;        //键盘Hook结构函数          [StructLayout(LayoutKind.Sequential)]        public class KeyBoardHookStruct        {            public int vkCode;            public int scanCode;            public int flags;            public int time;            public int dwExtraInfo;        }        #region DllImport        //设置钩子        [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 IntPtr GetModuleHandle(string name);        #endregion        #region 自定义事件        public void Hook_Start()        {            MessageBox.Show("安装键盘钩" + WH_KEYBOARD_LL + " hHook=" + hHook);            // 安装键盘钩子              if (hHook == 0)            {                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);                MessageBox.Show("KeyBoardHookProcedure=" + KeyBoardHookProcedure);                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);                //如果设置钩子失败.                  if (hHook == 0)                {                    Hook_Clear();                    throw new Exception("设置Hook失败!");                }                MessageBox.Show("hHook=" + hHook);            }        }        //取消钩子事件          public void Hook_Clear()        {            bool retKeyboard = true;            if (hHook != 0)            {                retKeyboard = UnhookWindowsHookEx(hHook);                hHook = 0;            }            //如果去掉钩子失败.              if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");        }        //这里可以添加自己想要的信息处理          public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)        {            if (nCode >= 0)            {                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                if (kbh.vkCode == (int)Keys.X)                {                    MessageBox.Show("禁止驶入X键");                    return 1;                }            }            return CallNextHookEx(hHook, nCode, wParam, lParam);        }        #endregion    }}


网上找个的一个全局键盘钩子代码, 我想借用一下。

C# code
KeyHook kh = new KeyHook();kh.Hook_Start();


可为什么不管用, 为什么? 这是为什么呢

[解决办法]
探讨

引用:

懒得拷代码测试了
坐等高手啊


1楼就是高手,帮帮忙哦, 我不进行实例化的时候,还可以, 就是按一次键盘捕捉到了两次,而且有点卡, 不晓得什么问题。

热点排行