标签: awtrobot

用户闲置10分钟后,Java应用程序使屏幕显示无响应

我编写了一个Java应用程序,允许用户编写鼠标/键盘输入脚本(JMacro,链接并不重要,只是为了好奇).我个人使用该应用程序在我睡觉的同时在线游戏中自动执行角色动作.不幸的是,我一直在早上回到电脑前发现它没有反应.经过进一步测试,我发现我的应用程序导致计算机在大约10分钟的用户空闲时间后无响应(即使应用程序本身模拟用户活动).我似乎无法指出这个问题,所以我希望其他人可能会建议在哪里寻找或可能导致问题的原因.

相关症状和特征:

  • 用户闲置10分钟后发生无响应
  • 用户仍然可以在屏幕上移动鼠标指针
  • 除鼠标外的所有内容都显示为冻结...鼠标单击无效,并且没有应用程序更新其显示,包括Windows 7桌面
  • 我离开了任务管理器,随着应用程序一夜之间,所以我可以在屏幕冻结之前看到最后一个任务管理器图像... Java应用程序正常CPU /内存使用率和总CPU使用率仅为~1%
  • 移动鼠标后(换句话说,用户从空闲状态返回),屏幕图像在30分钟内再次开始更新(这是非常受欢迎的,有时是10分钟,有时在两小时后没有结果)
  • 用户可以按CTRL-ALT-DEL进入Windows 7的CTRL-ALT-DEL屏幕(暂停30秒后).用户仍然可以移动鼠标指针,但单击任何按钮选项会导致屏幕再次冻结
  • 在一些非常罕见的情况下,系统永远不会冻结,我早上回到它,充分的响应
  • Java应用程序会在半夜自动停止输入脚本,因此Windows 7会检测到"真正的"空闲状态并将显示器转为待机模式......当我醒来时,他们在早上手动移动鼠标时成功退出即使桌面显示仍然显示为冻结

鉴于问题的症状和特征,就好像Java应用程序导致登录用户的桌面显示停止更新,包括任何正在运行的应用程序.

使用的编程概念和Java包:

  • 多线程
  • 标准输出错误被重新路由到javax.swing.JTextArea
  • 该应用程序使用Swing GUI
  • awt.Robot(非常使用)
  • awt.PointerInfo
  • awt.MouseInfo

系统规格:

  • Windows 7专业版
  • Java 1.6.0 u17

总之,我应该强调,我不是在寻找任何具体的解决方案,因为我没有提出一个非常具体的问题.我只是想知道在使用我正在使用的Java库时是否有人遇到过类似的问题.我也很乐意感谢有任何建议,试图进一步查明造成问题的原因.

谢谢!

罗斯

PS,我会发布更新/答案,如果我在继续调试时遇到其他任何问题.

更新:我的应用程序涉及多线程进程,每个进程初始化自己的Robot对象并异步创建输入事件.我重构了应用程序只包含一个Robot单例对象,但不同的进程仍然异步调用输入命令.据我所知,这并没有改变我的应用程序的行为.我的下一步可能是在Robot单例周围创建一个同步包装器,看看是否有帮助,但鉴于症状,我不知道为什么会这样.

java swing awt awtrobot

5
推荐指数
1
解决办法
3754
查看次数

如何在java中模拟键盘按下

我想模拟在JTextField中输入一个字符串(可以包含任何字符).我正在使用新的KeyEventData().但我无法确定如何处理{,},等等字符,以及如何将新字符附加到已输入的字符.

java swing jtextfield awtrobot

5
推荐指数
1
解决办法
6092
查看次数

用java改变鼠标缓冲区

我正在使用java创建一个机器人,但是有一个具有特殊和强大安全性的应用程序,我无法在那里执行我的机器人,由于某种原因我不知道,我的机器人在这样的应用程序时无法改变鼠标位置运行.我正在使用java.awt.Robot类来改变鼠标位置,但它不起作用,所以我想知道是否有另一种方法来改变java的鼠标位置,我想在尝试改变使用java的鼠标缓冲区(也许它不可能,是吗?).如果你能告诉我一些用java改变鼠标位置而不使用java.awt.Robot类,我感谢你.

例如,此代码将鼠标位置变为500,500坐标:

Robot robot = new Robot();
robot.mouseMove(500, 500);
Run Code Online (Sandbox Code Playgroud)

,但在具有特殊安全性的应用程序运行时它不起作用.

谢谢.

java awtrobot

5
推荐指数
1
解决办法
228
查看次数

覆盖鼠标的速率设置.创建我自己的鼠标速率算法

我正在和患有脑瘫的残疾儿童一起工作.一个孩子的精细运动控制有限,所以她目前使用操纵杆来控制鼠标,并且它的移动速度设置得非常低.这对她很有用,因为她可以点击屏幕上的所有按钮,但我认为我们可以做得更好 - 当她想要遍历整个屏幕时需要一个年龄(大约10秒).

我的假设是她的大脑很好,只有她的运动控制能力差.如果这是真的,我相信一个低速启动但经历恒定加速的鼠标对她来说会更好,因为它会提高速度并在穿越整个屏幕时变得快速.如果这样可行,那么我们可以调整PID控制,以及为大量残疾人设置速度/加速度,从而加快他们的访问速度,从而加快他们的学习和发展.

但我不知道建立这个的最佳方式 - 欢迎所有建议,想法,链接和提示.

首先,我尝试使用Processing和Java,并使用mouseListener和Robot来控制光标.我不相信这是最好的方法,因为我正在读光标位置然后写入它,所以我最好的尝试仍然会让光标跳转,并且没有平稳的移动.它在Java中是否可以实现?我是否需要使用某种驱动程序从USB读取鼠标输入,然后将屏幕上的光标替换为我自己的?

我制作了几个视频来说明我想要带来的效果.

现状(我的插图是将光标从箭头键上移开) http://www.youtube.com/watch?v=3ZhQCg5DJt8

我想要的新行为(鼠标加速) http://www.youtube.com/watch?v=JcBK_ZCFGPs

如果它有用,我用于制作这些演示的处理代码将在下面复制:

现状演示:

import java.awt.AWTException;
import jav
a.awt.Robot;

Robot robot;
int i = 0;
int j = 0;

void setup() {
  setupDotgame();
  try { 
    robot = new Robot();
  } 
  catch (AWTException e) {
    e.printStackTrace();
  }
  robot.mouseMove(screenWidth/2, screenHeight/2);
}

void draw() {
  //println(frameCount);
  robot.mouseMove(screenWidth/2+8*i, screenHeight/2+8*j);
  drawDotgame();
}

void keyPressed() {
  if (keyCode == UP) {
    j--;
  } 
  else if (keyCode == DOWN) {
    j++;
  }
  else if (keyCode == …
Run Code Online (Sandbox Code Playgroud)

java processing accessibility awtrobot mouselistener

5
推荐指数
1
解决办法
233
查看次数

如何使用createScreenCapture仅捕获所需的屏幕部分

以下代码捕获屏幕:

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;


public class capture{
    public static void main(String args[]) { 

        try { 
            Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); 
            Robot robot = new Robot(); 
            BufferedImage img = robot.createScreenCapture(new Rectangle(size)); 
        } catch(Exception e) { 
        } 

    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法,只捕获屏幕的所需部分(例如矩形,从一个x,y点到另一个)?

java screen awtrobot

5
推荐指数
1
解决办法
3122
查看次数

Java机器人类按土耳其字母(Ö,ö,Ş,ş,Ü,ü,Ğ,ğ,İ,ı,Ç,ç,Ə,ə)?

通过java机器人类按特殊字母(土耳其语等)我有问题.我有一种按键的方法,可以作为alt + keycode.我无法将一些特殊字母转换为当前键码.那我怎么解决呢 感谢名单

例如:

KeyStroke ks = KeyStroke.getKeyStroke('ö', 0);
 System.out.println(ks.getKeyCode());
 Output : 246
 // So alt+0246='ö'
 //but if I convert '?' to keycode
 //Output is 351 . So alt+351= '_' and alt+0351= '_' 
 //What is the Correct combination for '?'. same for '?', '?','?', '?', '?', '?', '?', '?'
Run Code Online (Sandbox Code Playgroud)

按键:

public void altNumpad(int... numpadCodes) {
    if (numpadCodes.length == 0) {
        return;
    }

    robot.keyPress(VK_ALT);

    for (int NUMPAD_KEY : numpadCodes) {
        robot.keyPress(NUMPAD_KEY);
        robot.keyRelease(NUMPAD_KEY);
    }

    robot.keyRelease(VK_ALT);
}
Run Code Online (Sandbox Code Playgroud)

java class keycode awtrobot

5
推荐指数
1
解决办法
958
查看次数

Selenium Actions还是Java AWT Robot?

到目前为止,我已经使用了Selenium Actions库来在我们的自动化项目中执行鼠标/键盘操作.

最近,我发现了Java AWT Robot类.它与Selenium Actions库相比如何?其中一个中有一些角落案例是另一个解决了吗?限制吗?稳定性?性能考虑?

java selenium awtrobot selenium-webdriver

5
推荐指数
1
解决办法
1万
查看次数

如何以编程方式按下android的物理按钮

我想以编程方式按音量按钮.在Java中,可以使用机器人类,但在Android中没有机器人类.

我想知道如何在Android中实现这一点.

android awtrobot

5
推荐指数
1
解决办法
2315
查看次数

Robot.mouseMove在Mac OS X中根本不起作用

我在IntelliJ IDE中使用该代码创建了Java文件

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;

public class JavaRobotExample {
    public static void main(String[] args) {
        int x = 12,
                y = 300;
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);

            int xAct = (int)    MouseInfo.getPointerInfo().getLocation().getX(),
                    yAct = (int) MouseInfo.getPointerInfo().getLocation().getY();

            String sPred = String.format("Predicted mouse location : %, d, %, d", x, y),
                    sAct = String.format("Actual mouse location : %, d, %, d", xAct, yAct);

            System.out.println(sPred);
            System.out.println(sAct);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该示例在Windows …

java macos mousemove awtrobot macos-mojave

5
推荐指数
1
解决办法
830
查看次数

为什么将Robot.delay(int ms)限制为1分钟?

执行软件时出现以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Delay must be to 0 to 60,000ms
    at java.awt.Robot.checkDelayArgument(Robot.java:544)
    at java.awt.Robot.delay(Robot.java:534)
    at com.company.Main.main(Main.java:10)
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是有一个睡眠时间限制,并且标准库异常消息的语法/错字(to 0 to?)不好。在检查了delay()方法的源代码之后,我注意到它限制了等待时间,因为出现了以下异常:

/**
 * Sleeps for the specified time.
 * To catch any <code>InterruptedException</code>s that occur,
 * <code>Thread.sleep()</code> may be used instead.
 * @param   ms      time to sleep in milliseconds
 * @throws  IllegalArgumentException if <code>ms</code> is not between 0 and 60,000 milliseconds inclusive
 * @see     java.lang.Thread#sleep
 */
public synchronized void delay(int ms) {
    checkDelayArgument(ms);
    try { …
Run Code Online (Sandbox Code Playgroud)

java api-design awtrobot

5
推荐指数
1
解决办法
62
查看次数