在JNA

2013-10-13 56 views
1
使用GetWindowModuleFileName

還有就是我的進程列表:在JNA

public class lab2 { 
    public static void main(String args[]) { 
     Kernel32 kernel32 = Kernel32.INSTANCE; 
     User32 user32 = User32.INSTANCE; 
     Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference(); 
     WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(
       Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
     char path[] = new char[512]; 
     HWND hWnd = User32.INSTANCE.GetWindowModuleFileName(hWnd, path, 512); 

     try { 
      while (kernel32.Process32Next(snapshot, processEntry)) { 
       System.out.println(Native.toString(processEntry.szExeFile) 
         + "\t" + Native.toString(path)); 
      } 
     } finally { 
      kernel32.CloseHandle(snapshot); 
     } 
    } 
} 

我試圖設置一個變量路徑的完整路徑的文件。我得到了一個錯誤@Type不匹配:無法從int轉換爲WinDef.HWND @HWND hWnd = User32.INSTANCE.GetWindowModuleFileName(hWnd, path, 512);我在哪裏出錯了?如何做到這一點?謝謝。

+0

這是我第一次到JNA庫。我不明白如何展示每個流程的路徑,我會很感激您的建議。 –

+0

爲了解決這個問題,我必須完成你現在要做的事情 - 檢查GetWindowModuleFileName上的MSDN條目,然後嘗試讓它與我的JNA應用程序一起工作。再次,我建議你開始的地方。 –

+0

謝謝你的建議。我試圖像這樣實現它:'user32.GetWindowModuleFileName(hWnd,path,512); \t \t \t \t的System.out.println(Native.toString(processEntry.szExeFile) \t \t \t \t \t \t + 「\ t」 的+ Native.toString(路徑));'我得到一個錯誤:**的hWnd不能被解析爲變量。**我忘了什麼? –

回答

1

您正在使用錯誤的功能。

  • 您在聲明它的同一行上使用hWnd變量。
  • 而且hWnd還沒有引用一個可行的窗口。
  • 我不知道你爲什麼要把int返回到HWND變量中。這沒有意義,並且是錯誤的根源。
  • 再次爲了工作的功能,你的HWND變量,hWnd需要引用一個可行的窗口句柄。你可能需要調用另一個JNA函數來獲得這個句柄。

例如,

User32 user32 = User32.INSTANCE; 
    char path[] = new char[512]; 

    long sleepTime = 2000; 
    try { 
    Thread.sleep(sleepTime); 
    } catch (InterruptedException e) {} 

    HWND hWnd = user32.GetForegroundWindow(); 
    user32.GetWindowModuleFileName(hWnd, path, 512); 
    System.out.println("Foreground Window Module FileName: " + 
      Native.toString(path)); 

    user32.GetWindowText(hWnd, path, 512); 
    System.out.println("Window text is: " + Native.toString(path));