2013-08-07 82 views
0

我已經完成了我的研究,沒有找到有用的結果。Java剪貼板作爲堆棧覆蓋覆蓋

這就是交易,我正在寫一個'新'剪貼板,它像堆棧而不是'區域'一樣工作。我很勇敢或愚蠢地在Java中這樣做。到目前爲止,在我的測試中,看看這是否可能,我設法創建了這個堆棧行爲。我得到的唯一問題是,有時候,主要是當我粘貼堆棧頂部(彈出操作)時,它不彈出或由於其他原因粘貼兩次。

例子: 如果我複製此三個字:卡洛斯,盧卡斯,伊斯特伍德 堆棧剪貼板的行爲像這樣在貼:伊斯特伍德,伊斯特伍德,盧卡斯,卡洛斯

我使用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) { 

} 

} 

回答

0

我想和你的建議一樣。

有一個不同於ctrl+cctrl+v的複製和粘貼組合鍵,你甚至可以繞過使用系統剪貼板。只需按下所選文本並將文本直接彈出到您的應用程序中的文本指針,當然提供的僅僅是針對特定應用程序使用此堆棧行爲。

系統會保留它自己的最新剪輯副本,並在粘貼操作時從您的sysClip.setContents(clipStack.pop(), null)中獲取重複副本。

我對禁用系統行爲沒有太多想法。你可以對此進行研究。但是你可以通過改變組合鍵來確保這是唯一的問題。

+1

謝謝!我解決了這個問題,有一個主題解釋了我是如何在[鏈接](http://www.thejavahub.net/thejavahub/index.php?topic=2601.0)上做到的。 –

+0

嘿,我看到了你的解決方案。很高興你找到了解決方案。但是,我想知道如果你不介意,我是否可以得到你的源代碼。我只想提及它。爲了提高知識你知道......! –

+0

我很快就會發布到github。 –