前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java SWT: addFilter热键监听Ctrl-C不正常的问题

java SWT: addFilter热键监听Ctrl-C不正常的问题

作者头像
10km
发布2019-05-25 21:43:46
8180
发布2019-05-25 21:43:46
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433545

SWT跟有道词典有什么关系?这两个东西有什么关联么?

如果你已经知道它们的关联就不需要看本文了。

下面是用windowbuilder生成的一个简单的java代码,我在代码中用addFilter增加了对Ctrl-C热键的侦听。如果检测到Ctrl-C按下,就输出消息。

实现的情况是:

Ctrl-C键的确可以被检测到

但是在程序的界面中按下鼠标左键拖动一段距离再松开,也能检测出Ctrl-C。

如果改成Ctr-M,Alt-C这些组合,就正常。

代码语言:javascript
复制
package testwb;

import org.eclipse.jface.bindings.keys.SWTKeySupport;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.DisposeEvent;

public class TestCtrlC {

    protected Shell shell;
    private final Listener ctrlcListener=new Listener(){
        @Override
        public void handleEvent(Event e) {
            // Ctrl-C检查             
            if(e.type==SWT.KeyDown&&SWTKeySupport.convertEventToModifiedAccelerator(e)==(SWT.CTRL+'C')
                    ){
                System.out.println("Ctrl-C");
            }               
        }};
    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            TestCtrlC window = new TestCtrlC();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shell = new Shell();
        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                // 对象销毁时删除过滤器
                shell.getDisplay().removeFilter(SWT.KeyDown, ctrlcListener);
            }
        });
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        // 加入Ctrl-C热键侦听器 
        shell.getDisplay().addFilter(SWT.KeyDown, ctrlcListener);
    }

}

这是为什么?

为什么明明是发生了鼠标事件,键盘事件却响应了?

是不是操作系统对Ctrl-C做了特别处理?

这个问题反反复复折腾了我一个多星期,偶尔却是正常的,一直没找到原因,后来干脆将热键定义成了别的组合避免这个问题。

今天这个问题又出现了,反反复复被折腾已经忍无可忍了,根据时好时坏的特点感觉不像是代码的问题,倒像是系统中其他软件的干扰,于是下决心找出这个”内鬼”。

重启电脑后,不打开别的应用,直接开eclipse运行上面的测试程序,发现是好的,

然后登录qq,也是正常的,

按照我正常的工作习惯打开了chrom浏览器,360浏览器都是正常的,

直到打开了有道词典,神迹复现啦!尼玛终于逮到你了。

在系统托盘中找到有道词典的图标,鼠标右键点击”软件设置”,

如下图是有道词典的设置界面,默认状态下,红框中的选项”启用划词释义”是勾选的,就是这个开关造成了系统消息混乱,只要不勾选它,就是正常的。

在这里对有道词典的这种流氓行径表示谴责!。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档