如何在SWT中监听粘贴键盘快捷键

时间:2017-08-09 08:35:57

标签: java swt copy-paste keydown ctrl

我想在全球范围内听取SWT中的CTRL + v。我可以成功地听取CTRL-c但是粘贴似乎是在SWT中经常处理的。以下Listener显示了它如何用于复制以及它如何不适用于粘贴:

display.addFilter(SWT.KeyDown, new Listener() {

        private final int CTRL = SWT.MOD1;
        private boolean checkNextEventForPaste = false;

        @Override
        public void handleEvent(Event event) {
            if(event.stateMask == CTRL && event.keyCode == 'c'){
                System.out.println("copy: this works!");
            }
            else if(event.stateMask == CTRL && (event.keyCode == 'v'
                    || event.keyCode == 'V'
                    || event.keyCode == 0x16
                    || event.keyCode == 118)){
                System.out.println("paste: does not work!");
            }

            else if (event.keyCode == CTRL){
                //control for paste is fired first
                checkNextEventForPaste  = true;
            }
            else if(checkNextEventForPaste){
                if(event.keyCode == 65536){
                    System.out.println("custom solution: seems to not only apply for paste");
                }
                checkNextEventForPaste = false;
            }
        }

    });

我调试了粘贴案例并创建了一个自定义解决方案。粘贴键盘快捷方式会创建以下事件序列:

  • 首先event stateMask = 0keyCode = CTRL
  • 使用eventstateMask = 0
  • 的第二个keyCode = 65536

问题是自定义粘贴解决方案似乎也适用于其他快捷方式。例如,复制快捷方式会创建以下事件序列:

  • 首先event stateMask = 0keyCode = CTRL
  • 使用eventstateMask = CTRL
  • 的第二个keyCode = 'c'
  • 第三个event stateMask = 0keyCode = 65536

为什么SWT以不同的方式处理粘贴快捷方式?是否有可能其他控件已使用粘贴快捷方式?或者有人知道如何识别粘贴快捷方式吗? VerifyListener不适用于我的用例。我已经使用自定义选择实现了一个或多或少复杂的用户界面,您可以看到here

1 个答案:

答案 0 :(得分:0)

以下代码适用于 Ctrl + c Ctrl + v

public static void main(String[] args)
{
    final Display d = new Display();
    Shell s = new Shell(d);

    d.addFilter(SWT.KeyDown, e ->
    {
        if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'c'))
        {
            System.out.println("copy");
        }
        else if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'v'))
        {
            System.out.println("paste");
        }
    });

    s.pack();
    s.open();

    while (!s.isDisposed())
    {
        if (!d.readAndDispatch())
            d.sleep();
    }
    d.dispose();
}