我正在编写一个应用程序,应该在启动时检查是否按下了shift键。为此,我创建了一个小班,负责:
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
public class KeyboardListener {
private static boolean isShiftDown;
static {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
isShiftDown = e.isShiftDown();
return false;
}
});
}
public static boolean isShiftDown() {
return isShiftDown;
}
}
但是,如果在应用程序启动时已按下shift键,则似乎无效。以下检查始终执行else案例。
if (KeyboardListener.isShiftDown()) {
// ...
} else {
// this always gets executed
}
如果在应用程序启动时已经按下了Shift键,是否有办法检查是否按下了Shift键?我知道这可以使用WinAPI,但我更喜欢Javaish的方式。
提前致谢!
答案 0 :(得分:1)
似乎不可能,因为它要求应用程序轮询初始状态,而不是AWT / Swing使用的事件模型。
答案 1 :(得分:1)
清理您的编码风格可能有所帮助,我发现您的代码难以阅读。
您的程序可能不会听到程序在设计开始之前发生的转换,因为此转换已发送到父程序而不是它。
答案 2 :(得分:1)
我将此描述为黑客,但它确实解决了问题(有一些缺点),所以我想我会提到它是一种可能性。
您可以使用Robot
类来模拟应用程序不关心的某些键的击键(可能是其中一个功能键)。注册KeyListener
后立即运行此代码。您会看到一个关键事件,它会告诉您Shift
是否已关闭。
警告:这对系统来说就像用户实际按下并释放F24
(或您选择的任何键)一样。这可能会产生意想不到的副作用。
(new Thread( )
{
@Override
public void run( )
{
try
{
java.awt.Robot robot = new Robot();
robot.delay( 100 );
robot.keyPress( KeyEvent.VK_F24 );
robot.keyRelease( KeyEvent.VK_F24 );
}
catch ( Exception e )
{
}
}
}).start( );