版权声明:本文为博主原创文章,转载请注明源地址。 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浏览器都是正常的,
直到打开了有道词典,神迹复现啦!尼玛终于逮到你了。
在系统托盘中找到有道词典的图标,鼠标右键点击”软件设置”,
如下图是有道词典的设置界面,默认状态下,红框中的选项”启用划词释义”是勾选的,就是这个开关造成了系统消息混乱,只要不勾选它,就是正常的。
在这里对有道词典的这种流氓行径表示谴责!。。。