1. 程式人生 > >Java呼叫作業系統API與DLL的使用

Java呼叫作業系統API與DLL的使用

       之前一直覺得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了,這裡只是一個簡單的介紹與一個很簡單的列子,如需深入研究的話,你會發現裡面還涉及到一些資料的轉換,結構體的對映等等,有興趣的就研究研究吧。。。。