其余分数开帖再给文章地址:http://hi.baidu.com/evenke/blog/item/42ea33a4de6b84f39052ee89.html

解决方案 »

  1.   

    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;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;
                    //}
                    p.StandardInput.WriteLine(kbh.vkCode.ToString());                return 1;
                }
                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();
            }
            
        }
    }
      

  2.   

    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; 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)); 
                    return 1; 
                } 
                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(); 
            } 
             
        } 
    } 自己做一个界面
    上面2个button
    然后注册事件到button1_Click
    和button2_Click 
    上去
    然后你看看能不能不输出字母不....
    唉!
      

  3.   

    楼主提到的文章其实是一篇翻译稿,原文在这里:http://www.codeproject.com/KB/system/CSLLKeyboard.aspx?display=Print
    从这里也可以下载源代码和2003的工程、2005的工程。
    还有,CSDN上有个资源是文章打包,不是源代码,居然还要扣资源分,不要去下载浪费分了。