2013-05-04 187 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