JNA操作windows 剪切板并生成emf图片

JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。

JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。

 

package com.wlb.jna;

import com.sun.jna.Library;
import com.sun.jna.platform.win32.WinNT.HANDLE;

public interface User32 extends Library
{
 //打开剪切板
 int OpenCliboard (int param);
 
 //获取剪切板数据
 HANDLE GetClipboardData(int param);
 
 //清空剪切板
 boolean EmptyClipboard();
 
 //关闭剪切板
 boolean closeClipboard();
}

 

package com.wlb.jna;

import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.win32.StdCallLibrary;

public interface Gdi32 extends StdCallLibrary
{
 HANDLE CopyEnhMetaFileA(HANDLE param, String param2);
 
 HANDLE DeleteEnhMetaFile(Handler param);
}

 

package com.wlb.jna;

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinNT.HANDLE;

public class TestJNA
{
 public static void main(String[] args)
 {
  //先将图片拷贝到剪切板
   copyPic();
  //在C盘生成emf;
  String target = "c:\\chart.emf";
  User32 user32 = (User32)Native.loadLibrary("user32", User32.class);
  
  //如果方法执行正确,返回非零数字
  int open = user32.OpenCliboard(0);
  System.out.println(open);
  
  //14指EMF图片类型
  //方法执行正确,返回当前句柄,否则返回null
  HANDLE getData = user32.GetClipboardData(14);
  
  //方法执行正确,返回当前句柄,否则返回null
  Gdi32 gdi32 = (Gdi32)Native.loadLibrary("gdi32",Gdi32.class);
  
  //方法执行正确,返回当前句柄,否则返回null
  HANDLE copy = gdi32.CopyEnhMetaFileA(getData, target);
  
  //方法执行正确,返回当前句柄,否则返回null
  HANDLE del = gdi32.DeleteEnhMetaFile(copy);
  System.out.println(del);
  
  //清空后返回true
  boolean empty = user32.EmptyClipboard();
  System.out.println(empty);
  
  //关闭后返回true
  boolean close = user32.closeClipboard();
  System.out.println(close);
 }

 

你可能感兴趣的:(JNA)