2013-05-04 44 views
0

尋找一種方式,通過使用JNA來獲取所有當前運行的Windows程序及其命令行的列表。這個網站上有幾個教程(Get list of processes on Windows in a charset-safe way),它們顯示瞭如何獲得正在運行的程序名稱列表,但我正在尋找完整的命令行。我見過帖子提到使用Module32First功能來做到這一點,但我似乎無法找到任何有關如何通過JNA使用它的文檔。有任何想法嗎?JNA:獲取所有窗口進程命令行

編輯:

我目前試過下面從上述職務。我們的想法是,我們需要一個在窗口上遍歷所有當前正在運行的進程並獲取其命令行的進程內方式。我們不想使用wmic。

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

EDIT2:

看的Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx)它說的下方。我試圖通過JNA獲得可執行文件的完整路徑。我想這是Module32First函數,JNA不支持MODULE32ENTRY結構。

szExeFile 進程的可執行文件的名稱。要檢索可執行文件的完整路徑,請調用Module32First函數並檢查返回的MODULEENTRY32結構的szExePath成員。但是,如果調用進程是32位進程,則必須調用QueryFullProcessImageName函數以檢索64位進程的可執行文件的完整路徑。

回答

0

你到目前爲止試過了什麼?類型映射非常簡單,JNA旨在讓您輕鬆擴展現有定義以擴充它們。

// Original C 
typedef struct tagMODULEENTRY32 { 
    DWORD dwSize; 
    DWORD th32ModuleID; 
    DWORD th32ProcessID; 
    DWORD GlblcntUsage; 
    DWORD ProccntUsage; 
    BYTE *modBaseAddr; 
    DWORD modBaseSize; 
    HMODULE hModule; 
    TCHAR szModule[MAX_MODULE_NAME32 + 1]; 
    TCHAR szExePath[MAX_PATH]; 
} MODULEENTRY32, *PMODULEENTRY32; 

// JNA equivalent (unicode version) 
public interface MyKernel32 extends Kernel32 { 
    class MODULEENTRY32 extends Structure { 
     DWORD dwSize; 
     DWORD th32ModuleID; 
     DWORD th32ProcessID; 
     DWORD GlblcntUsage; 
     DWORD ProccntUsage; 
     Pointer modBaseAddr; 
     DWORD modBaseSize; 
     HMODULE hModule; 
     char[] szModule = new char[MAX_MODUE_NAME32+1]; 
     char[] szExePath = new char[MAX_PATH]; 
     public String szModule() { return Native.toString(this.szModule); } 
     public String szExePath() { return Native.toString(this.szExePath); } 
     protected List getFieldOrder() { 
      return Arrays.asList(new String[] { 
       "dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage", "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath", 
      }); 
     } 
    } 

    MyKernel32 INSTANCE = (MyKernel32)Native.loadLibrary("kernel32", W32DEFAULT_OPTIONS); 
    boolean Module32First(HANDLE hSnapshot, MODULEENTRY32 lpme); 
} 
+0

我做了在後編輯上面更清楚地解釋什麼,我已經試過,我試圖做的。 – 2013-05-05 14:43:32