2016-09-23 2 views
0

私はコンソールアプリケーションでクリップボードを読んで、クリップボードの内容を印刷したいと思っています。それはMIMEタイプとは完全に独立して起こるはずです。私がJavaで言う限り、データのMIMEタイプに基づいて行われているので、私が期待していることを知っておく必要があります。デフォルトのDataFlavorは、テキストとバイナリをサポートしています。一般的なDataFlavor forすべてのMIMEタイプInputStreamとして

とにかく、画像、あらゆる種類のテキスト、シリアル化されたもの、あらゆる種類のバイナリデータをカバーしたいと思います。

簡単な部分はあまり役に立ちませんsystemClipboard.getContents(null).getTransferDataFlavors()上でループ

Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 

です。私はまたDataFlavor自分自身を作成し​​ようとしましたが、それは(私はサブタイプが「*」することができ、Javaのソースで分析するものから)動作しません。

systemClipboard.getData(new DataFlavor("application/*", "bytes")) 

また、私が理解する方法がわかりませんMIMEタイプが実際に何であるかを調べる。私が見たUNIXツールでは、それは私には分かりません。

最終的な目標は、反対のことをするデータジェネレータを作成することです。これは、クリップボードデータを作成して問題のアプリケーションに提供することを意味します。しかし、今は私が作成しなければならない構造を理解する必要があります。そのため、まずパーサが必要です。

+0

クリップボードの「コンテンツ」は、DataFlavorに依存する可能性があります。たとえば、テキストファイルをWordファイルやWebページからメモ帳(つまりプレーンテキスト)にコピーするときを考えてみましょう。はい、あなたは同じ文字を取得しますが、すべてのスタイリング=返された2つの異なるデータセットを失う – ControlAltDel

+0

この質問は無効であるため、この質問を議論の対象外としています。クリップボードから返される内容(データ)要求されたDataFlavorについて – ControlAltDel

+0

@ControlAltDelそうです。そして、私はそこにあるMIMEタイプとそのバイナリプレゼンテーション、あなたの場合はWordやHTMLのように見えます。言い換えれば、それが入っている味を理解したいと思います。そして、私はそれのために 'DataFlavor'を構築したいと思います。 – sjngm

答えて

0

Reflectionで関連するオブジェクトに深みを持たせた後、私はこれを思いつきました。私はこれが通常悪いことを知っています。文書化されていないクラスでは文書化されていないメソッドを実際に使用します。つまり、次のJavaリリースでは機能しない可能性があります。そのため、私はまだ素晴らしいソリューションを探しています! お持ちであれば、お気軽に回答を投稿してください!とにかく

public static void main(String[] args) throws Exception { 
    Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    System.out.println("systemClipboard: " + systemClipboard.getClass().getName()); 

    Method method = systemClipboard.getClass().getDeclaredMethod("getClipboardFormats"); 
    method.setAccessible(true); 
    long[] clipboardFormats = (long[]) method.invoke(systemClipboard); 

    for (long clipboardFormat : clipboardFormats) { 
    String line = "format " + clipboardFormat + ": "; 

    try { 
     method = systemClipboard.getClass().getDeclaredMethod("getClipboardData", long.class); 
     method.setAccessible(true); 
     byte[] bytes = (byte[]) method.invoke(systemClipboard, clipboardFormat); 

     line += "length: " + bytes.length + "\n"; 
     line += DatatypeConverter.printHexBinary(bytes) + "\n"; 
     line += new String(bytes); 
    } catch (Exception e) { 
     StringWriter stringWriter = new StringWriter(); 
     e.printStackTrace(new PrintWriter(stringWriter)); 
     line += stringWriter.getBuffer(); 
    } 

    System.out.println(line); 
    } 

}私はそれが実際に平野読みやすいXMLが含まれていることに気づいた時、私は見てクリップボードのために

。ただし、利用可能なDataFlavorを使用して通常の方法でロードすることはできません。これは、クリップボードにMIMEタイプの情報がない可能性があるためです。

私のシステムでは2行目がsystemClipboard: sun.awt.X11.XClipboardで、2つの方法はprotectedです。他の人のマシンとは違って見えるかもしれないと言っています。上記のコードを使用したい追加情報として

私は実行クリップボード形式はthis 589による589(作品のみ1)、460、462、463、464です(= 0x024D)はプライベートクリップボード形式です。

JavaがそのclipboardFormatをMIMEタイプにマップするところが興味深いでしょう。たぶんそれはいくつか説明します。

+0

私はDataFlavorのすべての非推奨非推奨の静的フィールドとDataFlavor.getTextPlainUnicodeFlavor()だけで、既知のDataFlavorsをポーリングします。確かに素晴らしいソリューションではありませんが、少なくともドキュメント化されていないAPIは使用されておらず、確実に動作します。 – VGR

関連する問題