2012-09-04 32 views
-1

我有關於如何使用c#.net使用System.Diagnostics和Process來獲取當前正在運行的進程的代碼,我想知道如何才能將這個等價物轉換爲java。我發現了很多研究,但它並沒有給我正確的答案。在java中獲取MainWindowTitle相當於

System.Diagnostics.Process[] process = new System.Diagnostics.Process.GetProcess(); 

foreach(Process p in process) 
{ 
    if(p.MainWindowTitle > 0) 
    { 
     console.writeline(p.MainwindowTitle); 
    } 
} 

這樣的事情!

+1

你需要JNI或JNA來做這件事,而我的偏好是後者,JNA。 –

+0

除非你在談論簡單地獲取Swing JFrame的主標題,然後它是微不足道的 - 'myJFrame.getTitle()'。但是如果你想要獲得非GUI窗口的窗口標題,那麼你需要深入研究OS的內部構件,而不能僅僅使用核心Java。 –

+0

獲取所有當前運行的進程不是jframe本身的那一個 – user1643284

回答

0

JNA是你想要使用的。在Java中更困難的原因是Java構建爲操作系統不可知論的東西,並且無論何時您嘗試執行的操作與操作系統的內部操作太接近,都必須離開核心Java並使用依賴於平臺的解決方案一種或另一種類型。

例如,這是獲得當前使用JNA運行窗口的名稱的一種方式,但我還沒有想出如何限制它只是頂層窗口:

import java.util.ArrayList; 
import java.util.List; 

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.win32.StdCallLibrary; 

public class EnumAllWindowNames { 
    static interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 

     interface WNDENUMPROC extends StdCallCallback { 
     boolean callback(Pointer hWnd, Pointer arg); 
     } 

     boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer userData); 

     int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount); 

     Pointer GetWindow(Pointer hWnd, int uCmd); 

     Pointer GetParent(Pointer hWnd); 

     Pointer GetAncestor(Pointer hWnd, int gaFlags); 
    } 

    public static String[] ignoreArray = { "Default", "MSCTFIME", "???????", "Msg", 
     "SysFader" }; 

    public static boolean ignore(String text) { 
     for (String ignoreText : ignoreArray) { 
     if (ignoreText.contains(text)) { 
      return true; 
     } 
     } 
     return false; 
    } 

    public static List<String> getAllWindowNames() { 
     final List<String> windowNames = new ArrayList<String>(); 
     final User32 user32 = User32.INSTANCE; 
     user32.EnumWindows(new User32.WNDENUMPROC() { 

     @Override 
     public boolean callback(Pointer hWnd, Pointer arg) { 
      byte[] windowText = new byte[512]; 
      user32.GetWindowTextA(hWnd, windowText, 512); 
      String wText = Native.toString(windowText).trim(); 
      if (!ignore(wText)) { 
       if (user32.GetParent(hWnd) == null) { 
        windowNames.add(wText); 
       } 
      } 
      return true; 
     } 
     }, null); 

     return windowNames; 
    } 

    public static void main(String[] args) { 
     List<String> winNameList = getAllWindowNames(); 
     for (String winName : winNameList) { 
     System.out.println(winName); 
     } 
    } 

} 

這需要使用兩個jna jar文件:platform.jar和jna.jar。