2012-03-26 54 views
2

我正在嘗試使用JNA返回特定Windows進程的詳細信息。不完全確定如何做到這一點。無法在互聯網上找到很多幫助。我想返回的一些信息包括CPU和內存使用情況。下面只是我找到的一個例子。JNA - 查詢Windows進程

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import com.sun.jna.*; 
import com.sun.jna.Library.Handler; 
import com.sun.jna.platform.win32.*; 
import com.sun.jna.platform.win32.Advapi32Util.*; 
import com.sun.jna.platform.win32.WinNT.*; 
import com.sun.jna.ptr.IntByReference; 
import com.sun.jna.win32.*; 

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.*; 
import com.sun.jna.win32.W32APIOptions; 


public class WindowsProcess { 

    public static void main(String[] args) { 

     WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS);   
     WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
     Thelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

     while (winNT.Process32Next(snapshot, processEntry)) {    
     System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));   

     }   
     winNT.CloseHandle(snapshot);  
     } 

    } 
+0

看這裏https://github.com/twall/jna/blob/master/www/DirectMapping.md和這裏http://twall.github.com/jna/3.4.0/javadoc/ – 2012-03-26 19:05:46

回答

7

此工程與JNA 3.5.0。我認爲,您擁有的示例與該庫的更新版本不兼容。

import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.Tlhelp32; 
import com.sun.jna.platform.win32.WinDef; 
import com.sun.jna.platform.win32.WinNT; 
import com.sun.jna.win32.W32APIOptions; 
import com.sun.jna.Native; 

public class ListProcesses { 
    public static void main(String[] args) { 
     Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 
     Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

     WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
     try { 
      while (kernel32.Process32Next(snapshot, processEntry)) {    
       System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile)); 
      } 
     } 
     finally { 
      kernel32.CloseHandle(snapshot); 
     } 
    } 
} 

另請參閱我的回答elsewhere