直接从Windows剪贴板中获取二进制数据

时间:2014-07-19 21:07:21

标签: java windows clipboard binary-data

我已经在桌子上撞了大约一个小时,现在只是试图找到一些方法来说出来......剪贴板上的一个字节数组。相反,我似乎只能找到有关如何从剪贴板中获取纯文本的信息......这根本没有用。

我已经尝试过这样做:Java getting bytes of clipboard

我也尝试过这样做:http://mrbool.com/manipulating-clipboard-content-with-java/24758

每次我遇到愚蠢的DataFlavor都是"不支持"。当然,我在这里缺少一些简单的东西......我的意思是......它如何支持纯文本,图像和java对象,但是没有具有的基本功能是所有这些?

很抱歉,如果我在这里听起来很讽刺和生气...... Java似乎对我产生了影响。 :(

1 个答案:

答案 0 :(得分:4)

Awt剪贴板和MIME类型

InsideClipboard表示内容的MIME类型为application/spark editor

您应该能够使用构造函数DataFlavor(String mimeType, String humanReadableFormat)创建MIME类型DataFlavor,在这种情况下,类表示将是InputStream,您可以从中以经典方式提取字节... < / p>

但是,这个剪贴板实现对mime类型定义非常严格,你不能使用格式为id的空格,这太糟糕了,因为你的编辑器似乎在那里放了一个空格:(

可能的解决方案,如果您有权访问JavaFX

JavaFX的剪贴板管理更宽松,可以容忍各种格式名称&#34; (在InsideClipboard中调用它们)在剪贴板中,而不仅仅是像awt中的无空间type/subtype mime格式。

例如,使用LibreOffice Draw 4.2并复制Rectangle形状,awt只能看到application/x-java-rawimage格式,而JavaFX看到的所有格式都与InsideClipboard相同:

  

[application / x-java-rawimage],[PNG],[Star Object Descriptor(XML)],[cf3],[Windows Bitmap],[GDIMetaFile],[cf17],[Star Embed Source(XML) ],[绘图格式]

然后,您可以在java.nio.ByteBuffer

中从JavaFX剪贴板中获取原始数据
//with awt
DataFlavor[] availableDataFlavors = Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors();
System.out.println("Awt detected flavors : "+availableDataFlavors.length);
for (DataFlavor f : availableDataFlavors) {
    System.out.println(f);
}

//with JavaFX (called from JavaFX thread, eg start method in a javaFX Application
Set<DataFormat> contentTypes = Clipboard.getSystemClipboard().getContentTypes();
System.out.println("JavaFX detected flavors : " + contentTypes.size());
for (DataFormat s : contentTypes) {
        System.out.println(s);
}

//let's attempt to extract bytes from the clipboard containing data from the game editor
// (note : some types will be automatically mapped to Java classes, and unknown types to a ByteBuffer)
// another reproducable example is type "Drawing Format" with a Rectangle shape copied from LibreOffice Draw 4.2
DataFormat df = DataFormat.lookupMimeType("application/spark editor");
if (df != null) {
    Object content = Clipboard.getSystemClipboard().getContent(df);
    if (content instanceof ByteBuffer) {
        ByteBuffer buffer = (ByteBuffer) content;
        System.err.println(new String(buffer.array(), "UTF-8"));
    } else
        System.err.println(content);
}