怎么将空格键禁用掉??

wumin940590725 2013-07-25 02:29:33
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;
}
}
...全文
923 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
佟博 2013-07-26
  • 打赏
  • 举报
回复
看不明白你说的事什么
WIN32SDK_ASM 2013-07-26
  • 打赏
  • 举报
回复
全局钩子,拦截空格键
xiejin90314 2013-07-26
  • 打赏
  • 举报
回复
form加载的时候监听键盘事件 如果键盘事件是空格 不作处理。。
jgwnet 2013-07-26
  • 打赏
  • 举报
回复
真是个好东西啊 学习下
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
lz不是想全面禁用空格吧,而是想在输入框中不让输入空格?
wumin940590725 2013-07-26
  • 打赏
  • 举报
回复
引用 45 楼 NCScan 的回复:
引用 44 楼 wumin940590725 的回复:
[quote=引用 43 楼 NCScan 的回复:]
Key_press和Key_down改过之后就不触发了,纠结了。
传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊[/quote]我开了新帖子讨论这个,有空来看看吧,哈哈http://bbs.csdn.net/topics/390529082
wumin940590725 2013-07-26
  • 打赏
  • 举报
回复
引用 45 楼 NCScan 的回复:
引用 44 楼 wumin940590725 的回复:
[quote=引用 43 楼 NCScan 的回复:]
Key_press和Key_down改过之后就不触发了,纠结了。
传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊[/quote]能说清楚点吗?我把e办了?我只是在press_down里面将按键和空格比较,按下的是空格键,就修改一下flag标志位而已啊.... 其实问题是触发事件不触发了(也就是不响应了),按按钮的时候不触发这个函数了。怪异。。。。。。。。。。
波波波波弟 2013-07-25
  • 打赏
  • 举报
回复
真是个好东西啊
NCScan 2013-07-25
  • 打赏
  • 举报
回复
引用 44 楼 wumin940590725 的回复:
引用 43 楼 NCScan 的回复:
Key_press和Key_down改过之后就不触发了,纠结了。
传进来的是KeyPressEventArgs e 。你都把参数e 给 办了。 他肯定不会再响应了啊
wumin940590725 2013-07-25
  • 打赏
  • 举报
回复
引用 43 楼 NCScan 的回复:
Key_press和Key_down改过之后就不触发了,纠结了。
NCScan 2013-07-25
  • 打赏
  • 举报
回复
引用 42 楼 wumin940590725 的回复:
[quote=引用 37 楼 NCScan 的回复:]
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位字母之后,就好了。。。。。。。。先谢了,一个下午就是忘了加个标志位,郁闷,呵呵[/quote] 呵呵 客气了,我没有去实际操作,目前也还没遇到你说的bug 晚上回去试一下
wumin940590725 2013-07-25
  • 打赏
  • 举报
回复
引用 37 楼 NCScan 的回复:
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位字母之后,就好了。。。。。。。。先谢了,一个下午就是忘了加个标志位,郁闷,呵呵
周美文 2013-07-25
  • 打赏
  • 举报
回复
好像有个这个可以重写 protected override void DefWndProc
NCScan 2013-07-25
  • 打赏
  • 举报
回复
引用 39 楼 wumin940590725 的回复:
引用 37 楼 NCScan 的回复:
[quote=引用 34 楼 wumin940590725 的回复:] [quote=引用 33 楼 NCScan 的回复:] 这样就不会响应 click 事件。 所以你需要 另一个事件 来中断 程序默认响应的click事件
????另一个事件??能给个想法不。。
晕。定义事件啊~~。那你就这样做嘛 简单些:

        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 ++; 
                
            }
          
        }



[/quote]这个方法真没想过,一直想改系统定义的[/quote]
wumin940590725 2013-07-25
  • 打赏
  • 举报
回复
引用 37 楼 NCScan 的回复:
引用 34 楼 wumin940590725 的回复:
[quote=引用 33 楼 NCScan 的回复:] 这样就不会响应 click 事件。 所以你需要 另一个事件 来中断 程序默认响应的click事件
????另一个事件??能给个想法不。。
晕。定义事件啊~~。那你就这样做嘛 简单些:

        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 ++; 
                
            }
          
        }



[/quote]这个方法真没想过,一直想改系统定义的
wumin940590725 2013-07-25
  • 打赏
  • 举报
回复
引用 36 楼 chaoyangzhixue 的回复:
这个键盘钩子,绝对能用,我利用它做的键盘统计程序,至今已经16万次的键盘捕捉了,一个没漏,并且没有错误,要是楼主不能用,继续提问吧
钩子一直嫌烦没看过,现在仔细看看。。。。。。不过你做的这个功能我也能做出来,不确定拦截是不是对的,先谢谢,看看再说
NCScan 2013-07-25
  • 打赏
  • 举报
回复
引用 34 楼 wumin940590725 的回复:
引用 33 楼 NCScan 的回复:
这样就不会响应 click 事件。 所以你需要 另一个事件 来中断 程序默认响应的click事件
????另一个事件??能给个想法不。。
晕。定义事件啊~~。那你就这样做嘛 简单些:

        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 ++; 
                
            }
          
        }



  • 打赏
  • 举报
回复
这个键盘钩子,绝对能用,我利用它做的键盘统计程序,至今已经16万次的键盘捕捉了,一个没漏,并且没有错误,要是楼主不能用,继续提问吧
  • 打赏
  • 举报
回复
这是哥们在用的东西,我已经用这个键盘钩子做了一个键盘统计程序了,在每天上万次的调用下也没出问题,所以给楼主看看,这也是我从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()事件中所有的截获操作注释掉,就可以正常使用了。 
加载更多回复(34)

111,076

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧