Get titles of Non-Java Windows in Java

后端 未结 2 399
囚心锁ツ
囚心锁ツ 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<String> getAllWindowNames() {
          final List<String> windowNames = new ArrayList<String>();
          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<String> winNameList = getAllWindowNames();
          for (String winName : winNameList) {
             System.out.println(winName);
          }
       }
    
    
    }
    
    0 讨论(0)
  • 2020-12-16 20:23

    Addition to @Hovercraft Full Of Eels, if you also have windows which are titled with unreadable characters and get "?" printed for those characters, try to:

    • convert byte[] to string by using different encoding (as I understood)

    see below:

    String wText = Native.toString(windowText, "windows-1254").trim();
    

    Possible encodings instead of "windows-1254 (which worked well for Turkish characters)":

    • UTF-8
    • UTF-16
    • ASCII
    • ISO-8859-1
    • ...
    0 讨论(0)
提交回复
热议问题