粘贴覆盖中作为堆栈的Java剪贴板

粘贴覆盖中作为堆栈的Java剪贴板,java,stack,customization,clipboard,Java,Stack,Customization,Clipboard,我已经做了研究,没有发现有用的结果 这里是交易,我正在写一个'新'剪贴板,像一个堆栈,而不是一个'地区的工作。我在Java中这样做是勇敢的还是愚蠢的。到目前为止,在我的测试中,为了看看这是否可能,我已经设法创建了这个堆栈行为。我遇到的唯一问题是,有时,主要是当我粘贴堆栈顶部(弹出操作)时,它不会弹出,或者由于其他原因,它会粘贴两次 例如: 如果我抄这三个字:卡洛斯,卢卡斯,伊斯特伍德 堆栈剪贴板在粘贴时的行为如下:伊斯特伍德、伊斯特伍德、卢卡斯、卡洛斯 我使用JNATIVEHOOK读取系统按键并

我已经做了研究,没有发现有用的结果

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

例如: 如果我抄这三个字:卡洛斯,卢卡斯,伊斯特伍德 堆栈剪贴板在粘贴时的行为如下:伊斯特伍德、伊斯特伍德、卢卡斯、卡洛斯

我使用JNATIVEHOOK读取系统按键并确定用户何时粘贴。 我想现在发生的是系统在我的代码之前粘贴。。。好的,下面是代码(这是一个测试,这解释了为什么注释不好):

导入java.awt.Toolkit;
导入java.awt.datatransfer.Clipboard;
导入java.awt.datatransfer.transfer;
导入java.util.Stack;
导入org.jnativehook.GlobalScreen;
导入org.jnativehook.NativeHookException;
导入org.jnativehook.NativeInputEvent;
导入org.jnativehook.keyboard.NativeKeyEvent;
导入org.jnativehook.keyboard.NativeKeyListener;
公共类Test3实现NativeKeyListener{
剪贴板sysClip=Toolkit.getDefaultToolkit().getSystemClipboard();
Stack clipStack=新堆栈();
公共静态void main(字符串[]args){
试一试{
GlobalScreen.registerNativeHook();
}捕获(本地钩子例外){
System.err
.println(“注册本机钩子时出现问题”);
System.err.println(例如getMessage());
系统出口(1);
}
Test2 t2=新的Test2();
//构造示例对象并初始化本机钩子。
GlobalScreen.getInstance().addNativeKeyListener(t2);
}
@凌驾
公共无效nativeKeyPressed(NativeKeyEvent ev){
//抄袭
如果(ev.getKeyCode()==NativeKeyEvent.VK_C
&&NativeInputEvent.GetModifierText(ev.getModifiers()).equals(
“Ctrl”)){
//剪掉流行音乐
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
clipStack.push(sysClip.getContents(null));
System.out.println(“Ctrl+C:Stack(“+clipStack.size()+”));
}
//粘贴
如果(ev.getKeyCode()==NativeKeyEvent.VK_V
&&NativeInputEvent.GetModifierText(ev.getModifiers()).equals(
“Ctrl”)){
//剪掉流行音乐
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
如果(clipStack.size()>1){
sysClip.setContents(clipStack.pop(),null);
}否则
setContents(clipStack.peek(),null);
System.out.println(“Ctrl+V:Stack(“+clipStack.size()+”));
}
}
@凌驾
公共无效nativeKeyReleased(NativeKeyEvent e){
}
@凌驾
公共无效nativeKeyTyped(NativeKeyEvent e){
}
}

我的想法和你建议的一样

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

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


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

谢谢!我解决了这个问题,有一个主题解释了我是如何做到的。嘿,我看到了你的解决方案。很高兴你找到了解决办法。不过,如果您不介意的话,我想知道是否可以得到您的源代码。我只是想提一下。为了增进你所知道的知识。。。!!我很快就会发到github。
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) {

}

}