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



我已经用头撞桌子一个小时了,只是想找个办法说……剪贴板上的字节数组。相反,我所能找到的似乎都是关于如何从剪贴板获取纯文本的信息…这一点用都没有。

我试着遵循这个:Java获得剪贴板的字节

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

每次我遇到愚蠢的datafflavor是"不支持"。我肯定是漏掉了一些简单的东西……我的意思是……它怎么能支持纯文本、图像和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并复制矩形形状,awt只看到application/x-java-rawimage格式,而JavaFX看到所有与InsideClipboard相同的格式:

[application/x-java-rawimage], [PNG],[星形对象描述符(XML)], [cf3], [Windows位图],[GDIMetaFile], [cf17],[星形嵌入源(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);
}

相关内容

  • 没有找到相关文章

最新更新