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

2019-05-25 21:43:46 浏览数 (2)

版权声明:本文为博主原创文章,转载请注明源地址。 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浏览器都是正常的,

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

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

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

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

0 人点赞