amobbs.com 阿莫电子技术论坛

标题: 求助 C# button点击后禁止获取焦点,避免回车、空格键触发按钮点击事件? [打印本页]

作者: longlong105    时间: 2020-11-21 08:06
标题: 求助 C# button点击后禁止获取焦点,避免回车、空格键触发按钮点击事件?
求助  C# button点击后禁止获取焦点,避免回车键、空格键触发
现象:winform页面中就多个button按钮具有不同功能,当点击某个按钮执行相关动作后!按钮被系统自动标记了焦点,此时如何按下键盘的空格 或回车键会导致此按钮事件再次触发!容易造成误动作!
尝试使用 Focus() 将焦点转移到其他无事件控件上,但效果不佳!

作者: 蓝蓝的恋    时间: 2020-11-21 08:11
点击以后禁用
作者: longlong105    时间: 2020-11-21 08:13
蓝蓝的恋 发表于 2020-11-21 08:11
点击以后禁用

不好吧,下次需要点击怎么搞哪!
作者: 深圳嘉立创-SMT    时间: 2020-11-21 09:12
按钮事件中将焦点移到主窗口上去.     

主窗口.Focus();
作者: wudicgi    时间: 2020-11-21 09:25
如果目的是只响应鼠标点击,而不管空格、回车键所触发的点击,还可以用 MouseClick 事件代替 Click 事件,
这样就可以通过 MouseEventArgs 判断是否是鼠标左键点击了

        private void button1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            MessageBox.Show("Left clicked");
        }


作者: Error.Dan    时间: 2020-11-21 09:27
堵不如疏,按键也是一个事件,找到这个事件屏蔽掉就可以了.

没记错的话,应该是keypress,直接在回调里面判断一下是否是回车然后把事件屏蔽掉
作者: longlong105    时间: 2020-11-21 09:37
深圳嘉立创-SMT 发表于 2020-11-21 09:12
按钮事件中将焦点移到主窗口上去.     

主窗口.Focus();

此方法尝试过,无效的奥
作者: 7073640    时间: 2020-11-21 09:44
longlong105 发表于 2020-11-21 09:37
此方法尝试过,无效的奥

做一个空的textbox,没用途的, focus过去
作者: wye11083    时间: 2020-11-21 09:44
Error.Dan 发表于 2020-11-21 09:27
堵不如疏,按键也是一个事件,找到这个事件屏蔽掉就可以了.

没记错的话,应该是keypress,直接在回调里面判断 ...

这其实是事件机制的缺点了,系统不知道你到底想做什么操作。因此需要自己覆盖事件。我记得是pretranslatemessage,自己捕获事件,然后决定是否转发给控件。
作者: longlong105    时间: 2020-11-21 10:05
7073640 发表于 2020-11-21 09:44
做一个空的textbox,没用途的, focus过去

尝试过,不能保证每次都能成功!
作者: 7073640    时间: 2020-11-21 10:12
longlong105 发表于 2020-11-21 10:05
尝试过,不能保证每次都能成功!

如果不能保证每次成功,那就是你程序有问题
作者: 7073640    时间: 2020-11-21 10:13
7073640 发表于 2020-11-21 10:12
如果不能保证每次成功,那就是你程序有问题

我做个扫码枪对焦点程序,从来没有不成功过
作者: longlong105    时间: 2020-11-21 10:30
7073640 发表于 2020-11-21 10:13
我做个扫码枪对焦点程序,从来没有不成功过

哎,界面有很多操作按钮,需要手动将每个按钮下加入Focus();     
我再梳理一下代码看看!

也是因为加入扫码读取设备编号。。。。。才有了这个问题!
作者: yuyu87    时间: 2020-11-21 11:05
本帖最后由 yuyu87 于 2020-11-21 11:07 编辑
  1.     public partial class Form1 : Form
  2.     {
  3.         protected override void WndProc(ref Message m)
  4.         {
  5.             //屏掉回车键及空格键
  6.             if (m.Msg == WMKEY_DOWN && m.xxxx==KEY.ENTER)
  7.             {
  8.                 //忽略
  9.             }
  10.             else
  11.             {
  12.                 base.WndProc(ref m);
  13.             }
  14.         }
复制代码

原理就是这样,
作者: Error.Dan    时间: 2020-11-21 12:36
longlong105 发表于 2020-11-21 10:30
哎,界面有很多操作按钮,需要手动将每个按钮下加入Focus();     
我再梳理一下代码看看!

为啥要手动?
直接遍历整个窗体下所有的控件,然后根据控件类型判断是个button的直接加上一个委托就行了.本身委托链也可以一次注入多个方法的.
包括上面说的keypress事件,完全可以this.controls.foreach(s)=>if(s is Button)s.keypress += buttons_keyPressHandle;(随手写的,意思是这个意思)一句话搞定啊~

C#界面编程上到一定的规模就不要再手动操作各个独立控件了,可以尝试一下分组甚至最简单的用命名方式去区分不同的控件功能组,成组的操作控件.体验一下什么叫面向对象编程.

我自己写的一些小程序,相同的控件数量稍微多一点我就动态生成了,手工拖控件又麻烦又丑,编辑界面下对齐了窗体一拖就丑的不行.
作者: huangmeilifan    时间: 2020-11-21 13:07
电工用C#的还真不少啊
作者: longlong105    时间: 2020-11-21 14:41
Error.Dan 发表于 2020-11-21 12:36
为啥要手动?
直接遍历整个窗体下所有的控件,然后根据控件类型判断是个button的直接加上一个委托就行了.本 ...

受教了!   
这个方法真不错!
马上用起来!





欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4