Robot.mouseMove(1000,1000)将鼠标移动到屏幕上的随机位置 - 为什么?


冷月如霜·胡狼
2025-03-18 05:44:41 (13小时前)


公共类MoveCursor扩展Application {
public static void main(String [] args){
发射(参数);
}
@覆盖
public void start(Stage stage)抛出异常{


4 条回复
  1. 0# 纾潆锦袖迷子 | 2019-08-31 10-32



    我写了一个“调整”功能,它做了肮脏的工作。
    注意:如果必须调整超过30 px,则终止。

    1. 的<strong>
    2. 你可以打电话:
    3. </强>




    moveAndClick(1000,1000,TRUE);





    1. private void moveAndClick(int x, int y, boolean click) throws AWTException {

    2. robot.mouseMove(x, y);
    3. adjustMouse(x, y);
    4. if (click) {
    5.     robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    6.     robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    7. }
    8. System.out.println("Move: " + x + " " + y + " Click:" + click);
    9. }

    10. private void adjustMouse(int x, int y) {

    11. int realX = MouseInfo.getPointerInfo().getLocation().x;
    12. int realY = MouseInfo.getPointerInfo().getLocation().y;
    13. int aX = x;
    14. int aY = y;
    15. int count = 0;
    16. while (realX != x || realY != y) {
    17.     System.out.println("Adjust:" + x + ":" + y + ">" + realX + ":" + realY + "");
    18.     aX = realX > x ? aX-- : aX++;
    19.     aY = realY > y ? aY-- : aY++;
    20.     robot.mouseMove(x, y);
    21.     try {  // you can remove this part 
    22.         Thread.sleep(30);
    23.     } catch (InterruptedException e) {
    24.         e.printStackTrace();
    25.     }
    26.     count++;
    27.     realX = MouseInfo.getPointerInfo().getLocation().x;
    28.     realY = MouseInfo.getPointerInfo().getLocation().y;
    29.     if (count > 30) {  // you can remove or increase this part
    30.         System.exit(0);
    31.     }
    32. }
    33. }

    34. </code>

  2. 1# CC-f | 2019-08-31 10-32



    次优,可怜的解决方案……但它

    作品
    </强>
    ……而且我在这个问题上浪费了太多时间,而不是我应该拥有的。




    1. import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
      import com.sun.jna.platform.win32.User32;
      import com.sun.jna.platform.win32.WinDef.DWORD;
      import com.sun.jna.platform.win32.WinDef.LONG;
      import com.sun.jna.platform.win32.WinUser.INPUT;
      import java.awt.MouseInfo;
      import java.awt.Point;

    2. public class Mouse {

    3. public static final int MOUSEEVENTF_MOVE = 1;
    4. public static void _winEvent_mi_move(int x, int y) {
    5.     mouseAction(x, y, MOUSEEVENTF_MOVE);
    6. }
    7. public static void mouseAction(int x, int y, int flags) {
    8.     INPUT input = new INPUT();
    9.     input.type = new DWORD(INPUT.INPUT_MOUSE);
    10.     input.input.setType("mi");
    11.     if (x != -1) {
    12.         input.input.mi.dx = new LONG(x);
    13.     }
    14.     if (y != -1) {
    15.         input.input.mi.dy = new LONG(y);
    16.     }
    17.     input.input.mi.time = new DWORD(0);
    18.     input.input.mi.dwExtraInfo = new ULONG_PTR(0);
    19.     input.input.mi.dwFlags = new DWORD(flags);
    20.     User32.INSTANCE.SendInput(new DWORD(1), new INPUT[]{input}, input.size());
    21. }
    22. public static void forceMove(int x, int y) {
    23.     init_abs_move_0_0:
    24.     {
    25.         Point ip = MouseInfo.getPointerInfo().getLocation();
    26.         _winEvent_mi_move(-ip.x, -ip.y);
    27.     }
    28.     moveX:
    29.     {
    30.         while (MouseInfo.getPointerInfo().getLocation().x < x - 1) {
    31.             _winEvent_mi_move(1, 0);
    32.         }
    33.     }
    34.     moveY:
    35.     {
    36.         while (MouseInfo.getPointerInfo().getLocation().y < y - 1) {
    37.             _winEvent_mi_move(0, 1);
    38.         }
    39.     }
    40.     System.out.println(MouseInfo.getPointerInfo().getLocation().toString());
    41. }
    42. public static void main(String[] args) {
    43.     forceMove(1000, 1000);
    44.     forceMove(2000, 1500);
    45. }
    46. }

    47. </code>


    通过使用awt.Robot实例逐个像素地移动某些东西,可以获得相同的结果……这看起来效果更好。



    是的…我确实尝试根据鼠标光标的当前位置和所有内容来计算指针目标的相对目标位置……但它仍然基于模糊地难以获取有关DPI缩放等的信息废话MS决定在WPI和GDI输入事件处理例程中实现。



    …将其直接移动到0x0然后1000x1000使得它导致由(2000x1400)定义的光标位置…没有时间也没有耐心去弄清楚它。 ……解决方案有效。故事结局。


  3. 2# 特狼普 | 2019-08-31 10-32



    是的,这是高分辨率屏幕的已知错误。看到

    https://bugs.openjdk.java.net/browse/JDK-8186063

    更多细节。



    最好的解决方案是在循环中运行命令,直到它到达正确的坐标。



    这样的事情的代码如下:




    1. for(int count = 0;(MouseInfo.getPointerInfo().getLocation().getX() != x ||
      MouseInfo.getPointerInfo().getLocation().getY() != y) &&
      count < 100; count++) {
      new Robot().mouseMove(x, y);
      }

    2. </code>


    请注意,此代码将最大迭代次数设置为100以防止无限循环,因此在循环之后立即执行另一次检查以确定它是否在正确的位置是值得的。


登录 后才能参与评论