Get titles of Non-Java Windows in Java

后端 未结 2 407
囚心锁ツ
囚心锁ツ 2020-12-16 19:57
Window.getWindows();

Doesn\'t get all the open windows, just the java ones. Is there a way to get all the windows the operating system has open.

2条回答
  •  我在风中等你
    2020-12-16 20:16

    There is no solution using core Java, but the problem can be solved using JNI or for an easier time, JNA. As noted in the comments, no solution (that I know of) will be platform independent.

    For instance, this demo program uses JNA to enumerate all Windows with title in a Windows platform, but will also include windows that are not top-level windows and even windows that aren't visible:

    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);
       }
    
       public static List getAllWindowNames() {
          final List windowNames = new ArrayList();
          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 (!wText.isEmpty()) {
                   windowNames.add(wText);
                }
                return true;
             }
          }, null);
    
          return windowNames;
       }
    
       public static void main(String[] args) {
          List winNameList = getAllWindowNames();
          for (String winName : winNameList) {
             System.out.println(winName);
          }
       }
    
    
    }
    

提交回复
热议问题