Java Awt Robot ændrer Windows Mouse Speed

Indlæg af Hanne Mølgaard Plasc

Problem



Hver gang jeg bruger Robot til at flytte musen, nulstiller den Windows-musens hastighed. Dette er virkelig irriterende at håndtere, og jeg spekulerede på, om nogen ved, hvordan man løser dette. Her er dybest set den kode, jeg kaster rundt med:


Robot robot = new Robot();
robot.mouseMove(10, 1070);
robot.delay(300);
robot.mousePress(InputEvent.BUTTON1\_MASK);
robot.mouseRelease(InputEvent.BUTTON1\_MASK);
robot.delay(300);
robotType("notepad");
robot.keyPress(KeyEvent.VK\_ENTER);
robot.keyRelease(KeyEvent.VK\_ENTER);
robot.delay(400);
robotType("I am writing this.");


Hvad dette gør er essentaily klik på startknappen, skriv 'notesblok', åben notesblok og derefter skrive 'Jeg skriver dette'.


robotType () er bare en hurtig funktion, jeg lavede, der konverterer en streng til en række tastaturpresser/udgivelser.

Bedste reference


Dette ser ud til at være en windows bug, da intet du har gjort iboende ændrer musens hastighed. Det ser ud til at du måske ikke er heldig ...

Andre referencer 1


Ikke en løsning, men en løsning:


Med JNA kan du få/indstille musens hastighed (kontroller, at du kører på Windows). Når dit program starter, skal du læse musens hastighed. Derefter gendannes den værdi efter hver robot.mouseMove().


Du skal tilføje jna.jar og jna-platform.jar, som kan findes her: https://github.com/java-native-access/jna/tree/master/dist[6]


interface User32 extends com.sun.jna.platform.win32.User32 {

    User32 INSTANCE = (User32) Native.loadLibrary(User32.class,
            W32APIOptions.DEFAULT\_OPTIONS);

    boolean SystemParametersInfo(
            int uiAction,
            int uiParam,
            Object pvParam, // Pointer or int
            int fWinIni
    );
}

public static void main(String[] args) throws AWTException {
    Pointer mouseSpeedPtr = new Memory(4);
    Integer mouseSpeed = User32.INSTANCE.SystemParametersInfo(0x0070, 0, mouseSpeedPtr, 0)
            ? mouseSpeedPtr.getInt(0) : null;

    //[...]

    rob.mouseMove(10, 1070);
    if (mouseSpeed != null) {
        User32.INSTANCE.SystemParametersInfo(0x0071, 0, mouseSpeed, 0x02);
    }

    //[...]
}