Java调用win32API与DLL的使用
2016-08-16 14:08
441 查看
之前一直觉得Java不能调用系统API就是一个莫大的遗憾,后来发现,我错了,还真可以的,下面就由小桩带你研究研究,如果你会会C++当然最好,学习Java的都知道,Java是跨平台的语言,需要虚拟机,Java是无法直接访问操作系统API的,这样在某些需求下就会受到限制,比如。我现在想关闭显示器,或锁定鼠标键盘,或获取系统信息,获取浏览器URL,获取播放器来播放多媒体等等,我们会发现Java貌似无法做到,那么我们如何用Java来操作系统API或调用DLL动态链接库呢?答案肯定是有的,他们就是JNA与JNI技术。
什么是JNI?全称Java Native Interface,即Java本地接口,它提供一套能与其它语言通信的API,主要是C(C++),其使用步奏如下:
什么是JNA? 全称Java Native Access,使用JNA比JNI简单许多,我们只需要在Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,调用起来感觉就像在调用Java代码一样方便。使用JNA需要两个架包,即jna-4.1.0.jar与jna-platform-4.1.0.jar,这样就行了。
以下代码将演示如何用JNA技术来调用User32 API来阻塞鼠标键盘的控制,并且开始闪屏,闪烁十次后退出,哈哈
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class Test
{
public interface User32 extends StdCallLibrary
{
User32 INSTANCE = (User32)Native.loadLibrary("User32",User32.class);//加载系统User32 DLL文件,也可以是C++写的DLL文件
int SendMessageA(int hwnd,int msg,int wparam,int lparam);
int FindWindowA(String arg0,String arg1);
void BlockInput(boolean isBlock);
int MessageBoxA(int hWnd,String lpText,int lpCaption,int uType);
}
public static void main(String[] args) throws Exception
{
int hwnd = User32.INSTANCE.FindWindowA(null, null);
System.setProperty("jna.encoding","GBK");//设置编码,防止乱码
User32.INSTANCE.MessageBoxA(hwnd, "看我闪瞎你的狗眼", 0, 0);//调用消息对话框
int i = 0;
while(true)
{
User32.INSTANCE.BlockInput(true);//阻塞鼠标键盘的输入
User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, 2);//关闭显示器
Thread.sleep(2000);//间隔2秒
User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, -1);//打开显示器
Thread.sleep(2000);//间隔2秒
i++;
if(i>10)
{
break;
}
}
User32.INSTANCE.BlockInput(false);//释放鼠标键盘
}
}
如果把键盘鼠标阻塞加入到死循环,那么,呵呵。。。。强制重启吧。。。。
有了以上知识,即可以任意调用系统API了,这里只是一个简单的介绍与一个很简单的列子,如需深入研究的话,你会发现里面还涉及到一些数据的转换,结构体的映射等等,有兴趣的就研究研究吧。。。。
什么是JNI?全称Java Native Interface,即Java本地接口,它提供一套能与其它语言通信的API,主要是C(C++),其使用步奏如下:
什么是JNA? 全称Java Native Access,使用JNA比JNI简单许多,我们只需要在Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,调用起来感觉就像在调用Java代码一样方便。使用JNA需要两个架包,即jna-4.1.0.jar与jna-platform-4.1.0.jar,这样就行了。
以下代码将演示如何用JNA技术来调用User32 API来阻塞鼠标键盘的控制,并且开始闪屏,闪烁十次后退出,哈哈
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class Test
{
public interface User32 extends StdCallLibrary
{
User32 INSTANCE = (User32)Native.loadLibrary("User32",User32.class);//加载系统User32 DLL文件,也可以是C++写的DLL文件
int SendMessageA(int hwnd,int msg,int wparam,int lparam);
int FindWindowA(String arg0,String arg1);
void BlockInput(boolean isBlock);
int MessageBoxA(int hWnd,String lpText,int lpCaption,int uType);
}
public static void main(String[] args) throws Exception
{
int hwnd = User32.INSTANCE.FindWindowA(null, null);
System.setProperty("jna.encoding","GBK");//设置编码,防止乱码
User32.INSTANCE.MessageBoxA(hwnd, "看我闪瞎你的狗眼", 0, 0);//调用消息对话框
int i = 0;
while(true)
{
User32.INSTANCE.BlockInput(true);//阻塞鼠标键盘的输入
User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, 2);//关闭显示器
Thread.sleep(2000);//间隔2秒
User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, -1);//打开显示器
Thread.sleep(2000);//间隔2秒
i++;
if(i>10)
{
break;
}
}
User32.INSTANCE.BlockInput(false);//释放鼠标键盘
}
}
如果把键盘鼠标阻塞加入到死循环,那么,呵呵。。。。强制重启吧。。。。
有了以上知识,即可以任意调用系统API了,这里只是一个简单的介绍与一个很简单的列子,如需深入研究的话,你会发现里面还涉及到一些数据的转换,结构体的映射等等,有兴趣的就研究研究吧。。。。
相关文章推荐
- Java调用win32API与DLL的使用
- Java使用JNI调用VC的DLL的一个小例子
- 使用 SWIG 实现 Java 调用 C++ DLL
- 浅谈JNI的使用--java调用dll
- JAVA 使用JNative调用DLL
- java使用jna 方法调用Win32 dll
- 整理MINGW编译dll使用JNI被java调用的几种方式
- Java调用dll例子,JNative的使用
- 如何在java中使用jna.jar调用Delphi写的dll
- Java使用JNI调用C/C++的DLL动态链接库1
- java调用dll进行人脸识别(JNI的使用)
- 使用JNI技术实现JAVA程序调用dll
- 浅谈JNI的使用--java调用dll
- 浅谈JNI的使用--java调用dll(原创)
- win32下使用gcc编译供java 调用的dll须知(jni) http://www.blogjava.net/lixf/archive/2005/12/23/25177.html
- 使用JNI技术实现JAVA程序调用dll
- java调用dll(JNI的使用)
- Java进阶: 使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)
- Java使用JNI调用DLL的问题总结
- java使用JNA(Java Native Access)调用dll的方法