如何在Java中获取程序窗口的x和y?

Ped*_*ini 7 java runtime jna coordinates awtrobot

有没有办法让我在java中获取窗口的X和Y值?我读到我将不得不使用运行时,因为java不能直接混乱,但是我不太清楚如何做到这一点.谁能指出一些如何获得这个的链接/提示?

Hov*_*els 19

要获得"任何其他无关应用程序"的x和y位置,您将不得不查询操作系统,这意味着可能使用JNI,JNA或其他一些脚本实用程序,如AutoIt(如果是Windows).我建议使用JNA或脚本实用程序,因为它们比JNI(我的经验有限)更容易使用,但要使用它们,您需要下载一些代码并将其与Java应用程序集成.

编辑1 我不是JNA专家,但是我确实把它搞砸了,这就是我得到一些命名窗口的窗口坐标:

import java.util.Arrays;
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.*;

public class GetWindowRect {

   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class,
               W32APIOptions.DEFAULT_OPTIONS);

      HWND FindWindow(String lpClassName, String lpWindowName);

      int GetWindowRect(HWND handle, int[] rect);
   }

   public static int[] getRect(String windowName) throws WindowNotFoundException,
            GetWindowRectException {
      HWND hwnd = User32.INSTANCE.FindWindow(null, windowName);
      if (hwnd == null) {
         throw new WindowNotFoundException("", windowName);
      }

      int[] rect = {0, 0, 0, 0};
      int result = User32.INSTANCE.GetWindowRect(hwnd, rect);
      if (result == 0) {
         throw new GetWindowRectException(windowName);
      }
      return rect;
   }

   @SuppressWarnings("serial")
   public static class WindowNotFoundException extends Exception {
      public WindowNotFoundException(String className, String windowName) {
         super(String.format("Window null for className: %s; windowName: %s", 
                  className, windowName));
      }
   }

   @SuppressWarnings("serial")
   public static class GetWindowRectException extends Exception {
      public GetWindowRectException(String windowName) {
         super("Window Rect not found for " + windowName);
      }
   }

   public static void main(String[] args) {
      String windowName = "Document - WordPad";
      int[] rect;
      try {
         rect = GetWindowRect.getRect(windowName);
         System.out.printf("The corner locations for the window \"%s\" are %s", 
                  windowName, Arrays.toString(rect));
      } catch (GetWindowRect.WindowNotFoundException e) {
         e.printStackTrace();
      } catch (GetWindowRect.GetWindowRectException e) {
         e.printStackTrace();
      }      
   }
}
Run Code Online (Sandbox Code Playgroud)

当然,为了实现这一点,需要下载JNA库并将其放在Java类路径或IDE的构建路径中.


And*_*son 7

在最终用户的帮助下,这很容易做到.让他们点击屏幕截图中的一个点.

例如

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

/** Getting a point of interest on the screen.
Requires the MotivatedEndUser API - sold separately. */
class GetScreenPoint {

    public static void main(String[] args) throws Exception {
        Robot robot = new Robot();
        final Dimension screenSize = Toolkit.getDefaultToolkit().
            getScreenSize();
        final BufferedImage screen = robot.createScreenCapture(
            new Rectangle(screenSize));

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JLabel screenLabel = new JLabel(new ImageIcon(screen));
                JScrollPane screenScroll = new JScrollPane(screenLabel);
                screenScroll.setPreferredSize(new Dimension(
                    (int)(screenSize.getWidth()/2),
                    (int)(screenSize.getHeight()/2)));

                final Point pointOfInterest = new Point();

                JPanel panel = new JPanel(new BorderLayout());
                panel.add(screenScroll, BorderLayout.CENTER);

                final JLabel pointLabel = new JLabel(
                    "Click on any point in the screen shot!");
                panel.add(pointLabel, BorderLayout.SOUTH);

                screenLabel.addMouseListener(new MouseAdapter() {
                    public void mouseClicked(MouseEvent me) {
                        pointOfInterest.setLocation(me.getPoint());
                        pointLabel.setText(
                            "Point: " +
                            pointOfInterest.getX() +
                            "x" +
                            pointOfInterest.getY());
                    }
                });

                JOptionPane.showMessageDialog(null, panel);

                System.out.println("Point of interest: " + pointOfInterest);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

典型输出

Point of interest: java.awt.Point[x=342,y=43]
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)


Gur*_*mus 5

这里的聚会有点晚了,但会添加这个以潜在地为其他人节省一点时间。如果您使用的是更新版本的 JNA,那么WindowUtils.getAllWindows()这将更容易实现。

我正在使用来自以下 Maven 位置的最新稳定版本:

JNA 平台 - net.java.dev.jna:jna-platform:5.2.0

JNA 核心 - net.java.dev.jna:jna:5.2.0

Java 8 Lambda(编辑:rect 是一个占位符,需要是最终的或有效的最终才能在 lambda 中工作)

//Find IntelliJ IDEA Window
//import java.awt.Rectangle;
final Rectangle rect = new Rectangle(0, 0, 0, 0); //needs to be final or effectively final for lambda
WindowUtils.getAllWindows(true).forEach(desktopWindow -> {
    if (desktopWindow.getTitle().contains("IDEA")) {
        rect.setRect(desktopWindow.getLocAndSize());
    }
});
Run Code Online (Sandbox Code Playgroud)

其他 Java

//Find IntelliJ IDEA Window
Rectangle rect = null;
for (DesktopWindow desktopWindow : WindowUtils.getAllWindows(true)) {
    if (desktopWindow.getTitle().contains("IDEA")) {
         rect = desktopWindow.getLocAndSize();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 JPanel 中,您可以绘制捕获的图像以适合(如果纵横比不同,将拉伸图像)。

//import java.awt.Robot;
g2d.drawImage(new Robot().createScreenCapture(rect), 0, 0, getWidth(), getHeight(), this);
Run Code Online (Sandbox Code Playgroud)