0

我做了我的研究,没有找到有用的结果。

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

示例:如果我复制这三个单词:Carlos、Lucas、Eastwood 堆栈剪贴板在粘贴时的行为如下: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) {

}

}
4

1 回答 1

0

我想和你建议的一样。

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

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

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

于 2013-09-07T00:38:43.953 回答