我有以下代码行,我正在尝试读取滚动锁的状态。
当我的程序启动时,我得到滚动锁定的状态。
不过我愿意实时获取状态。
请指导以下内容
package assignment;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import org.omg.PortableServer.THREAD_POLICY_ID;
public class ScrollLockOnOff {
public static void main(String[] args) throws InterruptedException
{
while(true)
{
Thread.sleep(1000);
Toolkit toolkit=Toolkit.getDefaultToolkit();
System.out.println(toolkit.getLockingKeyState(KeyEvent.VK_SCROLL_LOCK));
}
}
}
这是一个有趣的行为,正确报告初始状态,但依赖后续事件处理(具有聚焦的顶级窗口或托盘图标)进行更新。
如果我们有办法将 AWT 重置为其初始状态,应该可以解决该问题。如果我们没有找到这种可能性,直接的解决方法就是运行一个新的 JVM。由于具有相同属性的新 JVM 将使用缓存甚至共享内存中的资源,因此开销实际上要小得多。每秒执行一次该操作没有问题:
public class ScrollLockOnOff {
public static void main(String[] args)
throws InterruptedException, AWTException, IOException {
if(args.length == 1 && args[0].equals("VK_SCROLL_LOCK")) {
System.exit(Toolkit.getDefaultToolkit()
.getLockingKeyState(KeyEvent.VK_SCROLL_LOCK)? KeyEvent.VK_SCROLL_LOCK: 0);
return;
}
ProcessBuilder b = new ProcessBuilder(
Paths.get(System.getProperty("java.home"), "bin", "java").toString(),
"-classpath", System.getProperty("java.class.path"),
ScrollLockOnOff.class.getName(), "VK_SCROLL_LOCK"
).inheritIO();
while(true) {
Thread.sleep(1000);
int state = b.start().waitFor();
if(state != 0 && state != KeyEvent.VK_SCROLL_LOCK) {
System.err.println("failed");
break;
}
System.out.println(state == KeyEvent.VK_SCROLL_LOCK);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)