0

我一直在尝试使我的计算机上的一些任务自动化,并且确实从 Java 中选择了 Sikuli 来做到这一点(我每天都使用 Java,并且不知道任何使用 java 的自动化工具,sikuli 是我发现的第一个)。我使用 java 和 maven 和 eclipse 作为 IDE。我已将 Sikuli 添加为 Maven 依赖项。

<dependency>
    <groupId>com.sikulix</groupId>
    <artifactId>sikulixapi</artifactId>
    <version>2.0.5</version>
</dependency>

我试着做一些简单的事情。我使用 Windows 的屏幕截图工具对屏幕的某些部分进行了截图,并希望 sikuli 将其悬停。它对一张图像效果很好,但对其他图像则完全不行。似乎图像越大效果越好,因为我对任何小图像都没有成功。一个工作是整个窗口的屏幕(减少到我屏幕的~1/4)。我还尝试在此窗口中找到一个按钮,找到左下角的 windows 徽标,找到我的包资源管理器的屏幕,但没有一个可以正常工作。

我使用各种值玩了similar(),但它并没有改善结果。在某些情况下(窗口内的按钮),它确实找到了一些低相似值的结果,但它是另一个按钮。奇怪的部分是:它找到了另一个亮蓝色的按钮,而我正在寻找的是紫色的。

我的电脑背景从未改变,我做了一些 screen.highlight() 并查看正确的屏幕(双屏)。这不是图像路径的问题(已经解决了这个问题)。

你知道我可以尝试什么吗?我读过关于人们使用 Sikuli IDE 还是其他 IDE 的成功率不同的文章。所以也许我可以试试 sikuli IDE。

我一回到家就可以提供代码示例。

我用来测试的代码:

public class CleanTest {
    
    static Screen screen = new Screen();

    public static void main(String[] args) throws FindFailed, AWTException, IOException, InterruptedException {
        String pathYourSystem = System.getProperty("user.dir") + "\\";
        System.out.println(pathYourSystem);
        Pattern pLauncher = new Pattern(pathYourSystem+"img\\full_launcher.PNG").similar(0.9d);
        Desktop.getDesktop().open(new File("path_to_an_exe_opening_a_launcher"));
        screen.wait(pLauncher, 300);
        screen.mouseMove();
        System.out.println("launcher found");
    }

}

它适用于“完整启动器”图像,但找不到启动器的子部分(按钮)。我尝试编写一些代码来测试类似参数是否存在阈值:

double similarValue = 1d;
        Pattern pLauncher = new Pattern(pathYourSystem+"img\\the_button.PNG").similar(similarValue);
        Desktop.getDesktop().open(new File("path_to_an_exe_opening_a_launcher"));
        
        while(!screen.has(pLauncher)) {
            similarValue-=0.1;
            pLauncher = new Pattern(pathYourSystem+"img\\login.PNG").similar(similarValue);
        }
        System.out.println(similarValue);
        screen.mouseMove();

它会在 0.5 左右找到一些东西,但它是一个完全不同的按钮。

谢谢 !

编辑:如果有人有同样的问题,请尝试使用 sikulix IDE 截取屏幕截图。它适用于 IDE 截取的屏幕截图。

4

1 回答 1

1

这是一个简单的测试,完全符合 SikuliX 的功能。

import org.sikuli.basics.Debug;
import org.sikuli.script.*;

public class SikulixTest {
  public static void main(String[] args) {
    System.out.println("SikulixTest");
    Screen scr = new Screen();
    // craete an image to be searched on the screen
    Image img = new Image(scr.userCapture());
    // try to find it
    Match mImg = scr.exists(img);
    if (mImg != null) {
      // show sthg. when found
      Debug.info("%s", mImg);
      mImg.highlight(2);
    }
  }
}

这是来自 SikuliX 的 RaiMan

于 2021-11-10T16:12:29.990 回答