代码之家  ›  专栏  ›  技术社区  ›  Mark Korzhov

在JNA中使用GetWindowModuleFileName

  •  1
  • Mark Korzhov  · 技术社区  · 11 年前

    下面是我的流程列表:

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

    我试图设置一个变量 路径 文件的完整路径。我犯了一个错误 @类型不匹配:无法从int转换为WinDef.HWND@ 在里面 HWND hWnd = User32.INSTANCE.GetWindowModuleFileName(hWnd, path, 512); 我哪里出错了?如何做对?非常感谢。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Hovercraft Full Of Eels    11 年前

    你用错了函数。

    • 您在声明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));