在Java中操控剪切板数据- -

通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。

通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 来构造;系统剪切板通过

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

获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据

1. 从指定的剪切板中获取文本内容

protected static String getClipboardText(Clipboard clip) throws Exception{
  // 获取剪切板中的内容
  Transferable clipT = clip.getContents(null);
  if (clipT != null) {
   // 检查内容是否是文本类型
   if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
    return (String)clipT.getTransferData(DataFlavor.stringFlavor); 
  }
  return null;
}

2. 往剪切板写文本数据

protected static void setClipboardText(Clipboard clip, String writeMe) {
  Transferable tText = new StringSelection(writeMe);
  clip.setContents(tText, null);
}

3. 从剪切板读取图像

public static Image getImageFromClipboard() throws Exception{
  Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
  Transferable cc = sysc.getContents(null);
  if (cc == null)
   return null;
  else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))
   return (Image)cc.getTransferData(DataFlavor.imageFlavor);
  return null;
}

4. 写图像到剪切板

protected static void setClipboardImage2(final Image image) {
  Transferable trans = new Transferable(){
   public DataFlavor[] getTransferDataFlavors() {
    return new DataFlavor[] { DataFlavor.imageFlavor };
   }
   public boolean isDataFlavorSupported(DataFlavor flavor) {
    return DataFlavor.imageFlavor.equals(flavor);
   }
   public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
    if(isDataFlavorSupported(flavor))
     return image;
    throw new UnsupportedFlavorException(flavor);
   }
   
  };
  Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
 }

有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。

/*
 * Created on 2004-12-23
 * 查看图形的窗口
 */
package javayou.clipboard;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * @author Winter Lau 用于显示图形的窗口
 */
public class ImageViewer extends Frame {

 private Image image;

 /**
  * 显示一个图像
  * @param viewMe
  */
 public ImageViewer(Image viewMe) {
  image = viewMe;
  MediaTracker mediaTracker = new MediaTracker(this);
  mediaTracker.addImage(image, 0);
  try {
   mediaTracker.waitForID(0);
  } catch (InterruptedException ie) {
   ie.printStackTrace();
   System.exit(1);
  }
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  //窗口适应图像大小
  setSize(image.getWidth(null), image.getHeight(null));
  //窗口标题
  setTitle("Viewing Image from Clipboard");  
  setVisible(true);
 }

 public void paint(Graphics graphics) {
  graphics.drawImage(image, 0, 0, null);
 }

 /**
  * 用于读取图像文件并生成Image对象
  */

 public static Image getImageFromFile(String fileName) {
  Toolkit toolkit = Toolkit.getDefaultToolkit();
  Image image = toolkit.getImage(fileName);
  return image;
 }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可能是因为剪切板数据以不同的编码格式存储而导致乱码。为了解决这个问题,可以尝试以下方法: 1. 获取剪切板数据时指定编码格式 在获取剪切板数据时,可以指定编码格式,例如: ```c++ if (IsClipboardFormatAvailable(CF_TEXT)) { if (OpenClipboard()) { HGLOBAL hglb = GetClipboardData(CF_TEXT); if (hglb != NULL) { LPSTR lpstr = (LPSTR)GlobalLock(hglb); if (lpstr != NULL) { // 指定编码格式 std::string str = (const char*)lpstr; std::wstring wstr = utf8_to_wstring(str); // 使用 wstr GlobalUnlock(hglb); } } CloseClipboard(); } } ``` 这里使用了一个 `utf8_to_wstring` 函数将 UTF-8 编码的字符串转换为宽字符字符串,可以根据实际情况选择其他编码格式。 2. 统一编码格式 另一种方法是在程序内部将所有剪切板数据都统一转换为相同的编码格式。例如,可以将所有数据都转换成 UTF-8 编码,然后在程序使用 UTF-8 编码的字符串。 ```c++ if (OpenClipboard()) { std::string strData; HANDLE hData = NULL; char* pBuf = NULL; // 获取 CF_UNICODETEXT 格式的数据 hData = GetClipboardData(CF_UNICODETEXT); if (hData) { // 转换为 UTF-8 编码的字符串 pBuf = (char*)GlobalLock(hData); if (pBuf) { std::wstring wstr = (const wchar_t*)pBuf; strData = wstring_to_utf8(wstr); GlobalUnlock(hData); } } // 处理 strData // ... CloseClipboard(); } ``` 这里使用了一个 `wstring_to_utf8` 函数将宽字符字符串转换为 UTF-8 编码的字符串,也可以根据实际情况选择其他编码格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值