0

私は調査を行いましたが、有用な結果は見つかりませんでした。

これが取り引きです。「領域」ではなくスタックのように機能する「新しい」クリップボードを書いています。そして、私は Java でそれを行う勇気があるか、それとも愚かであるかを知りません。これまでのところ、これが可能かどうかを確認するためのテストで、このスタック動作を作成することができました。私が得ている唯一の問題は、主にスタックの一番上を貼り付ける (ポップ操作) ときに、ポップしないか、他の理由で 2 回貼り付けられることがあるということです。

例: 次の 3 つの単語をコピーした場合: 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 に答える