搜索
bottom↓
回复: 16
打印 上一主题 下一主题

求助 C# button点击后禁止获取焦点,避免回车、空格键触发按钮点击事件?

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2020-11-21 08:06:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助  C# button点击后禁止获取焦点,避免回车键、空格键触发
现象:winform页面中就多个button按钮具有不同功能,当点击某个按钮执行相关动作后!按钮被系统自动标记了焦点,此时如何按下键盘的空格 或回车键会导致此按钮事件再次触发!容易造成误动作!
尝试使用 Focus() 将焦点转移到其他无事件控件上,但效果不佳!

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入8汤圆

2
发表于 2020-11-21 08:11:33 | 只看该作者
点击以后禁用

出0入0汤圆

3
 楼主| 发表于 2020-11-21 08:13:44 | 只看该作者

不好吧,下次需要点击怎么搞哪!

出0入0汤圆

4
发表于 2020-11-21 09:12:31 | 只看该作者
按钮事件中将焦点移到主窗口上去.     

主窗口.Focus();

出0入0汤圆

5
发表于 2020-11-21 09:25:51 | 只看该作者
如果目的是只响应鼠标点击,而不管空格、回车键所触发的点击,还可以用 MouseClick 事件代替 Click 事件,
这样就可以通过 MouseEventArgs 判断是否是鼠标左键点击了

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

            MessageBox.Show("Left clicked");
        }

出0入20汤圆

6
发表于 2020-11-21 09:27:33 | 只看该作者
堵不如疏,按键也是一个事件,找到这个事件屏蔽掉就可以了.

没记错的话,应该是keypress,直接在回调里面判断一下是否是回车然后把事件屏蔽掉

出0入0汤圆

7
 楼主| 发表于 2020-11-21 09:37:48 | 只看该作者
深圳嘉立创-SMT 发表于 2020-11-21 09:12
按钮事件中将焦点移到主窗口上去.     

主窗口.Focus();

此方法尝试过,无效的奥

出0入0汤圆

8
发表于 2020-11-21 09:44:01 | 只看该作者
longlong105 发表于 2020-11-21 09:37
此方法尝试过,无效的奥

做一个空的textbox,没用途的, focus过去

出0入442汤圆

9
发表于 2020-11-21 09:44:47 来自手机 | 只看该作者
Error.Dan 发表于 2020-11-21 09:27
堵不如疏,按键也是一个事件,找到这个事件屏蔽掉就可以了.

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

这其实是事件机制的缺点了,系统不知道你到底想做什么操作。因此需要自己覆盖事件。我记得是pretranslatemessage,自己捕获事件,然后决定是否转发给控件。

出0入0汤圆

10
 楼主| 发表于 2020-11-21 10:05:49 | 只看该作者
7073640 发表于 2020-11-21 09:44
做一个空的textbox,没用途的, focus过去

尝试过,不能保证每次都能成功!

出0入0汤圆

11
发表于 2020-11-21 10:12:22 | 只看该作者
longlong105 发表于 2020-11-21 10:05
尝试过,不能保证每次都能成功!

如果不能保证每次成功,那就是你程序有问题

出0入0汤圆

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

我做个扫码枪对焦点程序,从来没有不成功过

出0入0汤圆

13
 楼主| 发表于 2020-11-21 10:30:42 | 只看该作者
7073640 发表于 2020-11-21 10:13
我做个扫码枪对焦点程序,从来没有不成功过

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

也是因为加入扫码读取设备编号。。。。。才有了这个问题!

出20入186汤圆

14
发表于 2020-11-21 11:05:02 | 只看该作者
本帖最后由 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.         }
复制代码

原理就是这样,

出0入20汤圆

15
发表于 2020-11-21 12:36:09 | 只看该作者
longlong105 发表于 2020-11-21 10:30
哎,界面有很多操作按钮,需要手动将每个按钮下加入Focus();     
我再梳理一下代码看看!

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

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

我自己写的一些小程序,相同的控件数量稍微多一点我就动态生成了,手工拖控件又麻烦又丑,编辑界面下对齐了窗体一拖就丑的不行.

出0入59汤圆

16
发表于 2020-11-21 13:07:40 | 只看该作者
电工用C#的还真不少啊

出0入0汤圆

17
 楼主| 发表于 2020-11-21 14:41:55 | 只看该作者
Error.Dan 发表于 2020-11-21 12:36
为啥要手动?
直接遍历整个窗体下所有的控件,然后根据控件类型判断是个button的直接加上一个委托就行了.本 ...

受教了!   
这个方法真不错!
马上用起来!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-16 10:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表