es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera en Java de poder hacer clic a través de un JFrame?

Estoy tratando de crear un superpuesto para un juego basado en HTML que se ejecuta en una ventana de navegador y he creado un JFrame que es opaco. Me gustaría poder seguir jugando el juego mientras tengo el superpuesto encima de la ventana. He probado algunas soluciones que encontré, pero no funcionaron para mí.

Se me ocurrió capturar el evento de clic en mi JFrame y “simular” el clic en la ventana del juego. Pero lamentablemente no tengo idea de cómo hacerlo posible.

Mi código actual utiliza las librerías JNA para acceder a la posición y escala de la ventana (en mi código de prueba Task-Manager). Estoy dispuesto a utilizar otra librería o algo así, si es posible.

Aquí está mi código hasta ahora:

import com.sun.jna.platform.DesktopWindow;
import com.sun.jna.platform.WindowUtils;

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

public class Test {
    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame("título");
        frame.setUndecorated(true);
        frame.setBackground(new Color(255, 69, 0, 100));
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Rectangle rect = null;

        while (true) {
            for (DesktopWindow desktopWindow : WindowUtils.getAllWindows(true)) {
                if (desktopWindow.getTitle().contains("Task-Manager")) {
                    rect = desktopWindow.getLocAndSize();
                    frame.setSize(rect.width - 16, rect.height - 8);
                    frame.setLocation(rect.x + 8, rect.y);
                    frame.setVisible(true);
                    Thread.sleep(10);
                }
            }
        }
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear una superposición para un juego basado en HTML que se ejecuta en una ventana del navegador y aún poder jugar el juego, puedes intentar seguir los siguientes pasos:

    1. Primero, configura la ventana JFrame como transparente en lugar de opaca. Esto te permitirá ver a través de la ventana JFrame e interactuar con el juego subyacente.
    2. Utiliza la clase Robot para simular clics con el mouse en la ventana del juego. Puedes utilizar la ubicación y dimensiones de la ventana del juego para calcular dónde hacer clic.

    3. Para realizar un seguimiento de la posición y escala de la ventana del juego, puedes continuar utilizando las bibliotecas JNA para acceder a la información.

    Aquí tienes un código de ejemplo que demuestra estos pasos:

    import java.awt.AWTException;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    
    import javax.swing.JFrame;
    
    import com.sun.jna.platform.DesktopWindow;
    import com.sun.jna.platform.WindowUtils;
    
    public class Overlay extends JFrame {
    
        private Rectangle gameRect;
        private Robot robot;
    
        public Overlay() {
            setUndecorated(true);
            setBackground(new Color(0, 0, 0, 0));
            setAlwaysOnTop(true);
            setOpacity(0.5f);
    
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    simulateGameClick(e.getX(), e.getY());
                }
            });
    
            addMouseMotionListener(new MouseMotionAdapter() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    simulateGameClick(e.getX(), e.getY());
                }
            });
    
            try {
                robot = new Robot();
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    
        public void start() {
            setVisible(true);
    
            while (true) {
                for (DesktopWindow desktopWindow : WindowUtils.getAllWindows(true)) {
                    if (desktopWindow.getTitle().contains("Game Window")) {
                        gameRect = desktopWindow.getLocAndSize();
                        setLocation(gameRect.x, gameRect.y);
                        setSize(gameRect.width, gameRect.height);
                        repaint();
                    }
                }
            }
        }
    
        private void simulateGameClick(int x, int y) {
            // Calcula las coordenadas del clic en la ventana del juego
            int gameX = gameRect.x + x;
            int gameY = gameRect.y + y;
    
            // Simula el clic utilizando la clase Robot
            robot.mouseMove(gameX, gameY);
            robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK);
        }
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
    
            // Dibuja la superposición transparente
            g.setColor(new Color(255, 69, 0, 100));
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }
    

    En este código, el JFrame se configura como transparente y la opacidad se establece en 0.5f. Esto permite al usuario ver a través de la superposición e interactuar con la ventana del juego. Los clics con el mouse y los eventos de arrastre en la superposición se interceptan y simulan en la ventana del juego utilizando la clase Robot.

    Las bibliotecas JNA siguen utilizándose para realizar un seguimiento de la posición y el tamaño de la ventana del juego. La superposición se redimensiona y se posiciona para que coincida con la ventana del juego.

    Para utilizar este código, crea una instancia de la clase Overlay y llama al método start(). Ten en cuenta que el título de la ventana del juego debe cambiarse a “Game Window” para que sea detectado por el código.

Comments are closed.