【问题标题】:Java clipboard as stack in paste overrideJava剪贴板作为粘贴覆盖中的堆栈
【发布时间】:2013-08-07 13:04:53
【问题描述】:

我已经完成了我的研究,没有找到有用的结果。

这是交易,我正在编写一个“新”剪贴板,它的工作方式类似于堆栈而不是“区域”。我在 Java 中做到这一点是勇敢还是愚蠢。到目前为止,在我的测试中,看看这是否可能,我已经设法创建了这个堆栈行为。我遇到的唯一问题是,有时,主要是当我粘贴堆栈顶部(弹出操作)时,它不会弹出或由于其他原因粘贴两次。

示例: 如果我复制这三个词:卡洛斯、卢卡斯、伊斯特伍德 粘贴时堆栈剪贴板的行为如下:Eastwood、Eastwood、Lucas、Carlos

我正在使用 JNativeHooks 来读取系统按键并确定用户何时粘贴。 我认为正在发生的事情是系统在我的代码之前粘贴......好吧,无论如何这是代码(这是一个测试,这解释了为什么它被错误评论):

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import java.util.Stack;

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.NativeInputEvent;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class Test3 implements NativeKeyListener {

Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
Stack<Transferable> clipStack = new Stack<>();

public static void main(String[] args) {
    try {
        GlobalScreen.registerNativeHook();
    } catch (NativeHookException ex) {
        System.err
                .println("There was a problem registering the native hook.");
        System.err.println(ex.getMessage());

        System.exit(1);
    }
    Test2 t2 = new Test2();
    // Construct the example object and initialze native hook.
    GlobalScreen.getInstance().addNativeKeyListener(t2);
}

@Override
public void nativeKeyPressed(NativeKeyEvent ev) {
    // Copy
    if (ev.getKeyCode() == NativeKeyEvent.VK_C
            && NativeInputEvent.getModifiersText(ev.getModifiers()).equals(
                    "Ctrl")) {
        // Clip the pop
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        clipStack.push(sysClip.getContents(null));

        System.out.println("Ctrl+C : Stack(" + clipStack.size() + ")");
    }
    // Paste
    if (ev.getKeyCode() == NativeKeyEvent.VK_V
            && NativeInputEvent.getModifiersText(ev.getModifiers()).equals(
                    "Ctrl")) {
        // Clip the pop
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (clipStack.size() > 1) {
            sysClip.setContents(clipStack.pop(), null);
        } else
            sysClip.setContents(clipStack.peek(), null);

        System.out.println("Ctrl+V : Stack(" + clipStack.size() + ")");
    }
}

@Override
public void nativeKeyReleased(NativeKeyEvent e) {

}

@Override
public void nativeKeyTyped(NativeKeyEvent e) {

}

}

【问题讨论】:

    标签: java stack customization clipboard


    【解决方案1】:

    我会和你建议的一样。

    拥有不同于ctrl+cctrl+v 的复制和粘贴组合键,您甚至可以使用系统剪贴板绕过。只需推送所选文本并将文本直接弹出到应用程序中的文本指针,当然前提是您仅将此堆栈行为用于特定应用程序。

    系统保留它自己的最新剪辑副本,并在粘贴操作时从您的sysClip.setContents(clipStack.pop(), null) 获取副本。

    我对禁用系统行为没有太多想法。你可以对此进行研究。但是您始终可以通过更改组合键来确保这是唯一的问题。

    【讨论】:

    • 谢谢!我解决了这个问题,link 有一个主题解释了我是如何做到的。
    • 嘿,我看到了你的解决方案。很高兴您找到了解决方案。但是,如果您不介意,我想知道是否可以获取您的源代码。我只是想参考一下。为了增强你所知道的知识......!!
    • 我会尽快发布到 github。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2016-01-30
    • 2017-12-23
    • 2015-07-29
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多