private void StopButton()
        {
            foreach (Control ctr in panel1.Controls)
            {
                //ctr.KeyPress+=new KeyPressEventHandler(ctr_KeyPress);
                ctr.KeyDown+=new KeyEventHandler(ctr_KeyDown);
            }
        }
        private void ctr_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                e.Handled = false;
            }
        }
        private void ctr_KeyPress(object sender,KeyPressEventArgs e)
        {
            if (e.KeyChar == 32)
            {
                e.Handled = true;
            }
        }

解决方案 »

  1.   

    我用了keyPress和keyDown事件,两个方法都不行,求高手帮助。
      

  2.   

    keyPress  这些都是针对于你的程序。当程序失去焦点的时候。你的事件和方法 毫无意义。
      

  3.   

    你在讲什么你的意思用onKeyDown???
      

  4.   

    那个不会,被打击了。。钩子好多人用的是vb,C#上面好像没有看了好多人写的,给我感觉都是截图,不全,好多变量都不知道怎么定义的郁闷
      

  5.   

          private void ctr_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Space)//当输入键为空格的时候
                {
                    e.Handled = false;这块有办法吗??我不知道怎么禁用
                }
            }
      

  6.   

    我的panel只是一个控件然后我调用上面的button,button是用tab选中的,panel当然没有焦点,焦点在button上啊。没有焦点连pressDown都触发不了的好不
      

  7.   

    一群人纠结在我有没有焦点上还不告诉我有什么用无语。我的panel是铺满的。所以我不认为会有焦点不存在的问题。谢谢
      

  8.   

    ........
    我 对你无语,你明白焦点吗?你想给那个控件禁用空格键?btn?还是panel
      

  9.   

    ........
    我 对你无语,你明白焦点吗?你想给那个控件禁用空格键?btn?还是panelbutton,将button的空格键禁用,因为button的设置有一个当获取到焦点的时候,按空格,回车键将触发button的click事件所以我不知道你说的焦点是什么意思
      

  10.   

      呵。搞笑哦。 我是给你说用API函数 监听键盘。你这个人怎么这样?自己问问题 还发火。 没兴趣说了,自己百度
      

  11.   

    foreach(control con in panel.controls)
    {
        button btn = con as button;
        if btn != null
           btn.keypress+=btn_BtnKeypress;
    }
      

  12.   

    就像我13楼说的那样,tab选中button之后,你按回车和空格就会触发click(而这个操作时需要焦点的,只有当有焦点在button上才会触发成功),而你跟我说我的操作要在有焦点的时候才有用这个你没看我的代码就随便想了一个可能告诉我。这样对吗?而且谁告诉你我发火了?我这个肯定有焦点,你说焦点问题我没反应过来问你是什么焦点这样也有问题??
      

  13.   

    foreach(control con in panel.controls)
    {
        button btn = con as button;
        if btn != null
           btn.keypress+=btn_BtnKeypress;
    }。。看不懂
      

  14.   

    用空方法??能给个API吗??
      

  15.   

    foreach(control con in panel.controls)
    {
        button btn = con as button;
        if btn != null
           btn.keypress+=btn_BtnKeypress;
    }。。看不懂
    给button添加keypress事件,之后再这个事件里写禁用空格的代码
    void btn_BtnKeyPress(object s ,keyeventarges e)
    if e.keycode == 空格
    e.handel = true
      

  16.   

            
    private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                if (e.KeyChar == 32)
                {
                    e.Handled = true;
                }
            }大哥,你看是我这个不,我用过了唉
      

  17.   

    void btn_BtnKeyPress(object s ,keyeventarges e)
    if e.keycode == 空格
    e.handel = true
    大哥,你if没有()???keyPress的方法不能用keyeventargs只能用keyPressEventArgs..然后e的对象调用之后handled没有handel。你这个代码我根本调用不了啊。。
      

  18.   

      不是做系统监听 可以不用API了,就用你的方法。但是如果方法体为空或者禁用 估计是没用 的!所以必须有一个事件 来中断 程序默认响应的click 事件!。所以写一个空方法。定义一个事件 。 就能达到效果。 比如你的方法:
       private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                if (e.KeyChar == 32)
                {
                    MessageBox.Show("估计不会响应click事件了!");
                }
            }
     猜测而已。测试一下吧
      

  19.   

    void btn_BtnKeyPress(object s ,keyeventarges e)
    if e.keycode == 空格
    e.handel = true
    大哥,你if没有()???keyPress的方法不能用keyeventargs只能用keyPressEventArgs..然后e的对象调用之后handled没有handel。你这个代码我根本调用不了啊。。
    不好意思,刚才试了一下 不好用,不好意思啊 兄弟
      

  20.   

    VB c# 都一样,都是调用WINDOWS API
    CSDN下有完整的DEMO下载
      

  21.   

      不是做系统监听 可以不用API了,就用你的方法。但是如果方法体为空或者禁用 估计是没用 的!所以必须有一个事件 来中断 程序默认响应的click 事件!。所以写一个空方法。定义一个事件 。 就能达到效果。 比如你的方法:
       private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                if (e.KeyChar == 32)
                {
                    MessageBox.Show("估计不会响应click事件了!");
                }
            }
     猜测而已。测试一下吧我试过这个,然后会出来
      

  22.   

         private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                if (e.KeyChar == 32)
                {
                    e.Handled = true;
                }
            }
    我就是这么写的,只是  e.Handled = true;这个位置的不会写了。
      

  23.   

      不是做系统监听 可以不用API了,就用你的方法。但是如果方法体为空或者禁用 估计是没用 的!所以必须有一个事件 来中断 程序默认响应的click 事件!。所以写一个空方法。定义一个事件 。 就能达到效果。 比如你的方法:
       private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                if (e.KeyChar == 32)
                {
                    MessageBox.Show("估计不会响应click事件了!");
                }
            }
     猜测而已。测试一下吧我试过这个,然后会出来
    这样就不会响应 click 事件。 所以你需要 另一个事件 来中断  程序默认响应的click事件
      

  24.   

    这是哥们在用的东西,我已经用这个键盘钩子做了一个键盘统计程序了,在每天上万次的调用下也没出问题,所以给楼主看看,这也是我从csdn大神那里看到的using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using hook;
    namespace hook
    {
        public partial class Form1 : Form
        {
            private hook.KeyboardHookLib _keyboardHook = null;         public Form1()
          {
             InitializeComponent();
          }         int num = 0;
          private void button1_Click(object sender, EventArgs e)
          {
             //安装勾子 
             _keyboardHook = new hook.KeyboardHookLib();
             _keyboardHook.InstallHook(this.OnKeyPress);
          }
          
          private void button2_Click(object sender, EventArgs e)
          {
             //取消勾子 
             if (_keyboardHook != null) _keyboardHook.UninstallHook();
          }
          
          /// <summary> 
          /// 客户端键盘捕捉事件. 
          /// </summary> 
          /// <param name="hookStruct">由Hook程序发送的按键信息</param> 
          /// <param name="handle">是否拦截</param> 
          public void OnKeyPress(hook.KeyboardHookLib.HookStruct hookStruct, out bool handle)
          {
             handle = false; //预设不拦截任何键 
             
             if (hookStruct.vkCode == 91) // 截获左win(开始菜单键)
             {
                handle = true;
             }
             
             if (hookStruct.vkCode == 92)// 截获右win
             {
                handle = true;
             }
             
             //截获Ctrl+Esc 
             if (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)
             {
                handle = true;
             }
             
             //截获alt+f4 
             if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)
             {
                handle = true;
             }
             
             //截获alt+tab 
             if (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)
             {
                handle = true;
             }
             
             //截获F1 
             if (hookStruct.vkCode == (int)Keys.F1)
             {
                handle = true;
             }
             
             //截获Ctrl+Alt+Delete 
             if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)
             {
                handle = true;
             }
             
             //如果键A~Z 
             if (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z)
             {
                //挡掉B键 
                if (hookStruct.vkCode == (int)Keys.B)
                hookStruct.vkCode = (int)Keys.None; //设键为0 
                
                handle = true;
             }
             
             Keys key = (Keys)hookStruct.vkCode;
             num++;
             label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString())+"   按下次数是:"+num.ToString();
             
          }
       }
    }using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;
    using System.Diagnostics;
    using Microsoft.Win32;
    using System.Windows.Forms; namespace hook
    {
       /// <summary> 
       /// 键盘Hook管理类, by www.vjsdn.com 易学原创 
       /// </summary> 
       public class KeyboardHookLib
       {
          private const int WH_KEYBOARD_LL = 13; //键盘 
          
          //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法. 
          private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
          
          //客户端键盘处理事件 
          public delegate void ProcessKeyHandle(HookStruct param, out bool handle);
          
          //接收SetWindowsHookEx返回值 
          private static int _hHookValue = 0;
          
          //勾子程序处理事件 
          private HookHandle _KeyBoardHookProcedure;
          
          //Hook结构 
          [StructLayout(LayoutKind.Sequential)]
          public class HookStruct
          {
             public int vkCode;
             public int scanCode;
             public int flags;
             public int time;
             public int dwExtraInfo;
          }
          
          //设置钩子 
          [DllImport("user32.dll")]
          private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);
          
          //取消钩子 
          [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
          private static extern bool UnhookWindowsHookEx(int idHook);
          
          //调用下一个钩子 
          [DllImport("user32.dll")]
          private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
          
          //获取当前线程ID 
          [DllImport("kernel32.dll")]
          private static extern int GetCurrentThreadId();
          
          //Gets the main module for the associated process. 
          [DllImport("kernel32.dll")]
          private static extern IntPtr GetModuleHandle(string name);
          
          private IntPtr _hookWindowPtr = IntPtr.Zero;
          
          //构造器 
          public KeyboardHookLib() { }
          
          //外部调用的键盘处理事件 
          private static ProcessKeyHandle _clientMethod = null;
          
          /// <summary> 
          /// 安装勾子 
          /// </summary> 
          /// <param name="hookProcess">外部调用的键盘处理事件</param> 
          public void InstallHook(ProcessKeyHandle clientMethod)
          {
             _clientMethod = clientMethod;
             
             // 安装键盘钩子 
             if (_hHookValue == 0)
             {
                _KeyBoardHookProcedure = new HookHandle(OnHookProc);
                
                _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
                
                _hHookValue = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                _KeyBoardHookProcedure,
                _hookWindowPtr,
                0);
                
                //如果设置钩子失败. 
                if (_hHookValue == 0) UninstallHook();
             }
          }
          
          //取消钩子事件 
          public void UninstallHook()
          {
             if (_hHookValue != 0)
             {
                bool ret = UnhookWindowsHookEx(_hHookValue);
                if (ret) _hHookValue = 0;
             }
          }
          
          //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 
          private static int OnHookProc(int nCode, int wParam, IntPtr lParam)
          {
             if (nCode >= 0)
             {
                //转换结构 
                HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
                
                if (_clientMethod != null)
                {
                   bool handle = false;
                   //调用客户提供的事件处理程序。 
                   _clientMethod(hookStruct, out handle);
                   if (handle) return 1; //1:表示拦截键盘,return 退出 
                }
             }
             return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
          }
          
       }
    }
    //如果其他的窗口输入的东西都被截止了,只要将OnKeyPress()事件中所有的截获操作注释掉,就可以正常使用了。 
      

  25.   

    晕。定义事件啊~~。那你就这样做嘛  简单些:        static int index = 0; //用来指示是那种情况触发的事件 默认为0        private void button1_Click(object sender, EventArgs e)
            {
                if (index == 0) //等于0的时候 就执行
                {
                    MessageBox.Show("这里是要执行的函数");
                }
                else
                {
                    abc--;
                }
            }
      /*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件 
       *到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
       *而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
      
            private void button1_KeyDown(object sender, KeyEventArgs e)
            {
                if(e.KeyCode == Keys.Space)
                {
                 index ++; 
                    
                }
              
            }
      

  26.   

    晕。定义事件啊~~。那你就这样做嘛  简单些:        static int index = 0; //用来指示是那种情况触发的事件 默认为0        private void button1_Click(object sender, EventArgs e)
            {
                if (index == 0) //等于0的时候 就执行
                {
                    MessageBox.Show("这里是要执行的函数");
                }
                else
                {
                    abc--;
                }
            }
      /*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件 
       *到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
       *而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
      
            private void button1_KeyDown(object sender, KeyEventArgs e)
            {
                if(e.KeyCode == Keys.Space)
                {
                 index ++; 
                    
                }
              
            }这个方法真没想过,一直想改系统定义的
      

  27.   

    晕。定义事件啊~~。那你就这样做嘛  简单些:        static int index = 0; //用来指示是那种情况触发的事件 默认为0        private void button1_Click(object sender, EventArgs e)
            {
                if (index == 0) //等于0的时候 就执行
                {
                    MessageBox.Show("这里是要执行的函数");
                }
                else
                {
                    abc--;
                }
            }
      /*当时空格键 发出指令,就将index的值+1,反正默认还是会执行button_click事件 
       *到那个时候index =1 。所以只能执行else里面的语句 自然又将值还原成为0.
       *而鼠标点击的时候 index的值没有改变所以就会一直为0;是0的话 就执行! */
      
            private void button1_KeyDown(object sender, KeyEventArgs e)
            {
                if(e.KeyCode == Keys.Space)
                {
                 index ++; 
                    
                }
              
            }这个方法真没想过,一直想改系统定义的
      

  28.   

    好像有个这个可以重写
     protected override void DefWndProc
      

  29.   

            private void StopButton()
            {
                foreach (Control ctr in panel1.Controls)
                {
                    ctr.KeyPress+=new KeyPressEventHandler(ctr_KeyPress);
                    //ctr.KeyDown+=new KeyEventHandler(ctr_KeyDown);
                    //ctr.onKeyPress();
                }
            }
            private void ctr_KeyDown(object sender, KeyEventArgs e)
            {
                space = false;          
                if (e.KeyCode == Keys.Space)
                {
                    space = true;
                }
            }
            private void ctr_KeyPress(object sender,KeyPressEventArgs e)
            {
                space = false;
                if (e.KeyChar == 32)
                {
                    space = true;
                }
                
            }
    出现一个bug不知道你遇到过没,按了空格之后禁用了,结果我再按回车键盘没反应,要按好几次之后才有反应,或者按下26位字母之后,就好了。。先谢了,一个下午就是忘了加个标志位,郁闷,呵呵
      

  30.   

      呵呵  客气了,我没有去实际操作,目前也还没遇到你说的bug  晚上回去试一下
      

  31.   

    Key_press和Key_down改过之后就不触发了,纠结了。
      

  32.   

     传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊
      

  33.   

     传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊能说清楚点吗?我把e办了?我只是在press_down里面将按键和空格比较,按下的是空格键,就修改一下flag标志位而已啊....
    其实问题是触发事件不触发了(也就是不响应了),按按钮的时候不触发这个函数了。怪异。
      

  34.   

     传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊我开了新帖子讨论这个,有空来看看吧,哈哈http://bbs.csdn.net/topics/390529082
      

  35.   

    form加载的时候监听键盘事件 如果键盘事件是空格 不作处理。。