Uzyskaj pozycję myszy

109

Chciałbym zasymulować naturalny ruch myszy w Javie (przechodząc od tego miejsca piksel po pikselu). Aby to zrobić, muszę znać współrzędne początkowe.

Znalazłem metodę event.getX () i event.getY (), ale potrzebuję zdarzenia ...

Jak mogę poznać pozycje bez robienia czegokolwiek (lub czegoś niewidocznego)?

Dziękuję Ci

Martin Trigaux
źródło

Odpowiedzi:

206

MouseInfo.getPointerInfo (). GetLocation () może być pomocna. Zwraca obiekt Point odpowiadający aktualnej pozycji myszy.

vpram86
źródło
46
getPointerInfo().getLocation()zwraca pozycję względem ekranu. Jeśli chcesz, aby pozycja w stosunku do twojego komponentu (jak podana przez MouseListeners), możesz yourComponent.getLocationOnScreen()od niej odjąć .
Thomas Ahle
2
+1 Container.getMousePosition()może czasami powrócić, nulljeśli mysz porusza się zbyt szybko, dzięki temu można uniknąć problemu.
Emily L.
11
Oprócz tego, co powiedział @ThomasAhle, możesz uniknąć samodzielnego wdrażania, stosując już zaimplementowaną metodę wygody:SwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
Andrei Vajna II
1
Uwaga MouseInfo.getPointerInfo()może zwrócić wartość null, gdy nie ma myszy lub w niektórych konfiguracjach multimon.
NateS
2
Zwróć uwagę, że SwingUtilities.convertPointFromScreen(..)konwertuje pierwszy argument w miejscu i nic nie zwraca, więc musi być napisany nieco inaczej w stosunku do komentarza @AndreiVajnaII, abyśmy mogli przechwycić Pointobiekt.
Evgeni Sergeev
42
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
System.out.print(y + "jjjjjjjjj");
System.out.print(x);
Robot r = new Robot();
r.mouseMove(x, y - 50);
Nauman Khalid
źródło
18
Proszę dodać następnym razem kilka komentarzy.
CSchulz
10

W SWT nie musisz być w słuchaczu, aby dostać się do lokalizacji myszy. Obiekt Display ma metodę getCursorLocation().

W waniliowym SWT / JFace zadzwoń Display.getCurrent().getCursorLocation().

W aplikacji RCP zadzwoń PlatformUI.getWorkbench().getDisplay().getCursorLocation().

W przypadku aplikacji SWT lepiej jest używać getCursorLocation()tych MouseInfo.getPointerInfo(), o których wspominali inni, ponieważ ta ostatnia jest zaimplementowana w zestawie narzędzi AWT, który SWT miał zastąpić.

stevorino
źródło
6
import java.awt.MouseInfo;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class MyClass {
  public static void main(String[] args) throws InterruptedException{
    while(true){
      //Thread.sleep(100);
      System.out.println("(" + MouseInfo.getPointerInfo().getLocation().x + 
              ", " + 
              MouseInfo.getPointerInfo().getLocation().y + ")");
    }
  }
}
Srb
źródło
6
import java.awt.MouseInfo;
import java.util.concurrent.TimeUnit;

public class Cords {

    public static void main(String[] args) throws InterruptedException {

        //get cords of mouse code, outputs to console every 1/2 second
        //make sure to import and include the "throws in the main method"

        while(true == true)
        {
        TimeUnit.SECONDS.sleep(1/2);
        double mouseX = MouseInfo.getPointerInfo().getLocation().getX();
        double mouseY = MouseInfo.getPointerInfo().getLocation().getY();
        System.out.println("X:" + mouseX);
        System.out.println("Y:" + mouseY);
        //make sure to import 
        }

    }

}
Josh McQuinn
źródło
4

Spróbuj spojrzeć na klasę java.awt.Robot. Umożliwia programowe poruszanie myszą.

Jeff Storey
źródło
1

Robię coś takiego, aby uzyskać współrzędne myszy za pomocą robota, używam tych współrzędnych dalej w kilku grach, które tworzę:

public class ForMouseOnly {
    public static void main(String[] args) throws InterruptedException {
        int x = MouseInfo.getPointerInfo().getLocation().x;
        int y = MouseInfo.getPointerInfo().getLocation().y;
        while (true) {

            if (x != MouseInfo.getPointerInfo().getLocation().x || y != MouseInfo.getPointerInfo().getLocation().y) {
                System.out.println("(" + MouseInfo.getPointerInfo().getLocation().x + ", "
                        + MouseInfo.getPointerInfo().getLocation().y + ")");
                x = MouseInfo.getPointerInfo().getLocation().x;
                y = MouseInfo.getPointerInfo().getLocation().y;
            }
        }
    }
}
Varun Ved
źródło
0

Jeśli używasz SWT, możesz chcieć przyjrzeć się dodaniu MouseMoveListener, jak wyjaśniono tutaj .

Topher Fangio
źródło
4
ale Listener jest wykonywany tylko wtedy, gdy coś zrobię (poruszę się, kliknę) myszą, prawda? Pierwszą rzeczą, której potrzebuję przed jego przeniesieniem, jest znajomość pozycji startowej
Martin Trigaux
0

W moim scenariuszu miałem otworzyć okno dialogowe w pozycji myszy na podstawie operacji GUI wykonanej za pomocą myszy. Poniższy kod zadziałał dla mnie:

    public Object open() {
    //create the contents of the dialog
    createContents();
    //setting the shell location based on the curent position
    //of the mouse
    PointerInfo a = MouseInfo.getPointerInfo();
    Point pt = a.getLocation();
    shellEO.setLocation (pt.x, pt.y);

    //once the contents are created and location is set-
    //open the dialog
    shellEO.open();
    shellEO.layout();
    Display display = getParent().getDisplay();
    while (!shellEO.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    return result;
}
sudipn
źródło