天天看点

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);

 }

继续阅读