给我也来一份,谢谢
[email protected]

解决方案 »

  1.   

    http://blog.csdn.net/DL88250/archive/2007/02/12/1507994.aspx
    也是调用一堆api,感觉用c#不是很适合,用vc++非托管代码比较合适,毕竟不能保证客户端安装了framework
      

  2.   

    我也要一份 研究 [email protected]
      

  3.   

    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;
    using System.IO;
    using System.Text.RegularExpressions;namespace WindowsApplication1
    {
        ///    <summary>   
        /// Description of MainForm.   
        ///    </summary>   
        public partial class Form4 : Form
        {        //委托  
            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 int GetCurrentThreadId();        [DllImport("kernel32.dll")]
            public static extern IntPtr GetModuleHandle(string name);        #endregion
            #region 自定义事件
            public void Hook_Start()
            {
                
                // 安装键盘钩子   
                if (hHook == 0)
                {
                    KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);                //hHook = SetWindowsHookEx(2,  
                    //            KeyBoardHookProcedure,  
                    //           GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());                  hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                              KeyBoardHookProcedure,
                             GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);                //如果设置钩子失败.   
                    if (hHook == 0)
                    {
                        Hook_Clear();
                        //throw new Exception("设置Hook失败!");  
                    }
                }
            }        //取消钩子事件   
            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.S && (int)Control.ModifierKeys == (int)Keys.Control)  // 截获F8   
                    //{
                    //    MessageBox.Show("快捷键已拦截!不能保存!");
                    //    return 1;                //}
                    //if (kbh.vkCode == (int)Keys.Delete
                    //   && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)  //截获Ctrl+Alt+Y   
                    //{                //    MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");   
                    //    return 1;
                    //}
                    //if (kbh.vkCode == (int)Keys.X)
                    //{
                    //    MessageBox.Show("不能全部保存!");
                    //    return 1;
                    //}       
                                  return 0;
                }
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
            #endregion        public Form4()
            {            InitializeComponent();
            }
          
            private void button1_Click(object sender, EventArgs e)
            {
                    Hook_Start();
            }        private void button2_Click(object sender, EventArgs e)
            {
                
                Hook_Clear();
            }
        }
    }
      

  4.   

    codeproject有
    第二 普通的钩子无法屏蔽alt ctrl del组合键
      

  5.   

    何必如此麻烦.NET Hook Library
      

  6.   

    朋友,你介绍的codeproject,里面全英文,我汗啊。
      

  7.   


    可惜我对C++不怎么了解以前只是接触 过不过我不介意你发过来我看看API里的参数修改谢谢
      

  8.   


    framwork将其也打包进去不过一个framwork就占好几十MB了现在要是叫我去再研究C++/VC++,那恐怕,我没这个劲了怎么说要精一样了解多样。而不可能样样精通样样精通说白了,其实就是样样都不精通。呵呵
      

  9.   

    我觉得VS2005 和VS2003下,钩子的功能有所变化。VS2003下钩子正常使用。VS2005下钩子不可以正常使用,我试过在VS2003下可以屏蔽很多按键。包括很多的功能键或功能组合键。但是在VS2005下,就不行了。很多键还是可以按。钩子起不了作用。
      

  10.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection ;
    using System.Runtime .InteropServices ;
    using System.Diagnostics;
    namespace Hook
    {
        public partial class Form1 : Form
        {        private string str = "";
            
            [StructLayout (LayoutKind .Sequential)]
            public struct KeyInfo
            {
                 public UInt32 vkCode;
                 public UInt32 scanCode;
                 public UInt32 flags;
                 public UInt32 time;
                 public IntPtr extraInfo;        }        public delegate int HookProc(int idcode,IntPtr wparam,IntPtr   lparam); 
            public HookProc HookEvent;
            private IntPtr HHook = IntPtr.Zero;        public Form1()
            {
                InitializeComponent();
               
            }
            [DllImport("User32.dll")]
            private extern static IntPtr  SetWindowsHookEx(int hooktype,HookProc  lpfun, IntPtr instance, int threadid);
            [DllImport("User32.dll")]
            private extern static int CallNextHookEx(IntPtr hook, int idcode, IntPtr wparam, IntPtr    lparam);
            [DllImport("User32.dll")]
            private extern static int UnhookWindowsHookEx(IntPtr hook);
         
            }        private int HookFun(int idcode, IntPtr wparam, IntPtr   lparam)
            {           KeyInfo kf = (KeyInfo) Marshal.PtrToStructure(lparam ,typeof (KeyInfo));
               int i = this.GetRemoteProcessId();
               label2.Text = i.ToString();
               if (i != 0)
                 label2.Text =((Keys)kf.vkCode).ToString ();
                 str += ((Keys)kf.vkCode).ToString();
                 this.textBox1.Text = str;
                return CallNextHookEx(HHook, idcode, wparam, lparam);
            }        private void InstallHook()
            {            HookEvent = new HookProc(HookFun);               if (HHook == IntPtr.Zero)
                {
                    try
                    {                    HHook = SetWindowsHookEx(13, HookEvent, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly ().GetModules ()[0]), 0);
                        label1.Text = "Install sucess   "+HHook .ToString ();
                    }
                 
                    catch (Exception e)
                    {
                        MessageBox.Show("Set Hook failed!"+e.Message .ToString ());                }
                }        }        private void UnInstalHook()
            {            if (HHook != IntPtr.Zero)
                {
                    try
                    {                    UnhookWindowsHookEx(HHook);
                        label1.Text = "UnInstall Sucess";
                        label2.Text = "";
                        textBox1.Text = "";
                        HHook = IntPtr.Zero;
                    }                catch (Exception e)
                    {                    MessageBox.Show("UnInStall Failed!" + e.Message.ToString());                }            }            else
                {
                    label1.Text = "Hook  already UnInstall or No Install Hook!";            }        }
            private void Form1_Load(object sender, EventArgs e)
            {                   }        private void button2_Click(object sender, EventArgs e)
            {
                this.UnInstalHook();
            }        private void Button1_Click(object sender, EventArgs e)
            {              this.InstallHook();        }        protected override void OnFormClosed(FormClosedEventArgs e)
            {
                base.OnFormClosed(e);            if (HHook != IntPtr.Zero)
                {
                    this.UnInstalHook();
                }
            }    }
    }
    //HOOK 只要要调用API就可以实现了;
    /*
    主要代码就: [StructLayout (LayoutKind .Sequential)]
            public struct KeyInfo
            {
                 public UInt32 vkCode;
                 public UInt32 scanCode;
                 public UInt32 flags;
                 public UInt32 time;
                 public IntPtr extraInfo;        }要安装为全局钩子,就考这段代码了;得到要映射到进程的文件的句柄,因为钩子函数在当前文件中所以就是当前文件的句柄了。
    Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly ().GetModules ()[0];public delegate int HookProc(int idcode,IntPtr wparam,IntPtr   lparam);
    public HookProc HookEvent;注意调试的时候都不能正常执行,但是找到当前文件路径下的debug下的exe文件点击运行可以正常运行。*/
      

  11.   


    你的代码不完整。无法测试。HookProc委托没有找到。
      

  12.   

    汗我忘记结这张贴了。原来我之前是程序调测的问题。因为Hook的一些相关API调用。不能调测的。只能运行。难怪,我说运行起来。钩子都不起作用了。后来我在VS2005打开以后的钩子相关项目的Debug目录运行.exe文件就成了。钩子就生效了。