Java 在Windows中,如何以编程方式使整个屏幕闪烁为黑色&;白色

Java 在Windows中,如何以编程方式使整个屏幕闪烁为黑色&;白色,java,winapi,timer,Java,Winapi,Timer,我使用的是一个简单的Pomotoro计时器,但我没有声音/扬声器,因此我想通过简单地用指定颜色清空屏幕,然后用另一种颜色切换几次来发出计时器结束的信号。就好像我把我的显示器变成了一个左转信号灯。我怎样才能像那样控制显示器?有一些win32代码吗 我熟悉Java,更不用说c或c了++ 我不确定控制整个屏幕的动机是什么。也许更合适的做法是在系统托盘中显示通知 无论如何,使用Java可以在全屏模式下弹出一个JFrame。使用计时器更改其背景几次,然后将其关闭。下面是一个简单的示例,演示了类似的内容:

我使用的是一个简单的Pomotoro计时器,但我没有声音/扬声器,因此我想通过简单地用指定颜色清空屏幕,然后用另一种颜色切换几次来发出计时器结束的信号。就好像我把我的显示器变成了一个左转信号灯。我怎样才能像那样控制显示器?有一些win32代码吗

我熟悉Java,更不用说c或c了++


我不确定控制整个屏幕的动机是什么。也许更合适的做法是在系统托盘中显示通知

无论如何,使用Java可以在全屏模式下弹出一个
JFrame
。使用计时器更改其背景几次,然后将其关闭。下面是一个简单的示例,演示了类似的内容:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;

class FullScreenFrame extends JFrame{
    private static final int MAX_COUNT = 3;
    private static final int PERIOD = 1000;
    private JPanel panel;
    private int count;

    public FullScreenFrame(){
        super();

        setUndecorated(true);

        getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "ESCAPE");
        getRootPane().getActionMap().put("ESCAPE", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        panel = new JPanel();
        panel.setBackground(Color.GREEN);
        add(panel);

        new Timer(PERIOD, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (count < MAX_COUNT) {
                    if (count % 2 == 0){
                        panel.setBackground(Color.BLACK);           
                    } else {
                        panel.setBackground(Color.GREEN);
                    }
                    count++;

                } else {
                    ((Timer) e.getSource()).stop();
                    dispose();
                }
            }

        }).start();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                FullScreenFrame frame = new FullScreenFrame();
                frame.setBounds(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getBounds());
                frame.setAlwaysOnTop(true);
                frame.setVisible(true);
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GraphicsEnvironment;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入javax.swing.AbstractAction;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
导入javax.swing.Timer;
类FullScreenFrame扩展了JFrame{
私有静态最终整数最大计数=3;
私有静态最终整数周期=1000;
私人JPanel小组;
私人整数计数;
公共全屏画面(){
超级();
未装饰的设置(真实);
getRootPane();
getRootPane().getActionMap().put(“ESCAPE”,新的AbstractAction()){
已执行的公共无效操作(操作事件e){
处置();
}
});
panel=新的JPanel();
面板.立根背景(颜色.绿色);
添加(面板);
新计时器(句点,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(计数<最大计数){
如果(计数%2==0){
面板.立根背景(颜色.黑色);
}否则{
面板.立根背景(颜色.绿色);
}
计数++;
}否则{
((计时器)e.getSource()).stop();
处置();
}
}
}).start();
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
FullScreenFrame=新的FullScreenFrame();
frame.setBounds(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getBounds());
frame.setAlwaysOnTop(真);
frame.setVisible(true);
}
});
}
}

非常感谢Max-你太棒了!