本帖最后由 houzhenya 于 2009-12-10 10:51:53 编辑

解决方案 »

  1.   

     private   void   Form1_KeyDown(object   sender,   System.Windows.Forms.KeyEventArgs   e)   
      {   
          if   (e.KeyCode==Keys.Enter)   
          {   
                SendKeys.Send("{TAB}");  //输入tab 
                e.Handled=ture;   
            }   
      }   
      

  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;namespace WindowsApplication1
    {
        public partial class AutoDeleteMessageBox : Form
        {
            [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
            private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);        [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);        public const int WM_CLOSE = 0x10;        public AutoDeleteMessageBox()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                StartKiller();
                MessageBox.Show("3秒钟后自动关闭MessageBox窗口", "MessageBox");
            }        private void StartKiller()
            {
                Timer timer = new Timer();
                timer.Interval = 3000; //3秒启动
                timer.Tick += new EventHandler(Timer_Tick);
                timer.Start();
            }        private void Timer_Tick(object sender, EventArgs e)
            {
                KillMessageBox();
                //停止Timer
                ((Timer)sender).Stop();
            }        private void KillMessageBox()
            {
                //按照MessageBox的标题,找到MessageBox的窗口
                IntPtr ptr = FindWindow(null, "MessageBox");
                if (ptr != IntPtr.Zero)
                {
                    //找到则关闭MessageBox窗口
                    PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                }
            }
        }
    }
      

  3.   

    得看你是拦截按键还是输入.如果是:中文输入,需要hook IME ;普通字符hook WM_CHAR;按键 低级键盘钩子WH_KEYBOARD_LL
      

  4.   

    如果是按键替换,可以低级键盘钩子WH_KEYBOARD_LL,return 1;达到拦截本来输入,再PostMessage一个消息到主窗口实现自己的替换输入. 如果是输入法输入的文字替换,需要hook imm32的 ImmGetCompositionString函数
      

  5.   

    另外模拟函数按出来的键 有个标志位叫injected. 可以判断是真实按键还是虚拟按键
      

  6.   

    WH_KEYBOARD_LL hook的结构中 kbh.flags & LLKHF_INJECTED
      

  7.   

    LLKHF_INJECTED
    我在程序里面找不到这个 
      

  8.   

    public delegate int HookProc(int nCode, IntPtr 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", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            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", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            //调用下一个钩子
            public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);        [DllImport("kernel32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
            private static extern IntPtr GetModuleHandle(string lpModuleName);
            #endregion
            #region 自定义事件    
            public void Hook_Start()
            {
                // 安装键盘钩子
                if (hHook == 0)
                {
                    KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
                    //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                    Process curProcess = Process.GetCurrentProcess();
                    ProcessModule curModule = curProcess.MainModule;                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
                                        GetModuleHandle(curModule.ModuleName), 0);                //KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
                    //hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                    //            KeyBoardHookProcedure,
                    //            Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 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;
                    this.label1.Text = "";
                }
                //如果去掉钩子失败.
                if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
            }        //这里可以添加自己想要的信息处理
            public  int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                if (nCode >= 0)
                {
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                this.label1.Text += GetUnicode(kbh.vkCode);                if (kbh.vkCode == (int)Keys.Enter)
                    {
                        this.label1.Text += "\r\n";
                    }
                }
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
            #endregion
            
            /*
            [STAThread]
            public static void Main(string[] args)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
            */        public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
               
            }        void Start_BtnClick(object sender, EventArgs e)
            {
                this.Hook_Start();
            }        void Clear_BtnClick(object sender, EventArgs e)
            {
                this.Hook_Clear();
            }        public string GetUnicode(int i)
            {
                char c = (char)i;            return c.ToString();
            }
    我想在红色的这里,区分是我输入的还是模拟键盘输入的,请帮忙看一下  谢谢
      

  9.   

     public  int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                if (nCode >= 0)
                {
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));               this.label1.Text += GetUnicode(kbh.vkCode);                if (kbh.vkCode == (int)Keys.Enter)
                    {
                        this.label1.Text += "\r\n";
                    }           }
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
      

  10.   

    private const int LLKHF_INJECTED = 0x10;
      

  11.   

    给你写全吧!
    public  int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam) 
            { 
                if (nCode >= 0) 
                { 
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 
          if((kbh.flags &  0x10) != 0) //LLKHF_INJECTED = 0x10;
          {
              //这是模拟按键
                return 1;//全部拦截,也可以进行键值判断后决定是否拦截
          }
          else
         {
              //这是真实按键
          }
      } 
      return CallNextHookEx(hHook, nCode, wParam, lParam); 
            }