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

我一直在桌子上敲打我的头大约一个小时,只是试图找到某种方式说出来......从剪贴板中取出一些字节。 相反,我所能找到的所有信息都是关于如何从剪贴板获取纯文本的信息......这根本没有帮助。

我试过以下这些:Java获取剪贴板的字节

我也试过以下这个:http://mrbool.com/manipulating-clipboard-content-with-java/24758

每次遇到“不受支持”的愚蠢DataFlavor时。 当然,这只是简单的,我错过了这里...我的意思是...它如何支持纯文本,图像和Java对象,但没有基本的功能,必须在所有这一切的引擎盖下?

对不起,如果我听起来讽刺和恼火...... Java似乎对我有这样的影响。 :(


Awt剪贴板和MIME类型

InsideClipboard显示内容的MIME类型是application/spark editor

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

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

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

JavaFX的剪贴板管理更加宽松,并且允许在剪贴板中使用各种“格式名称”(如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);
}
链接地址: http://www.djcxy.com/p/21703.html

上一篇: Getting binary data directly off the windows clipboard

下一篇: How to use @Contract annotation