Javafx写全局快捷键截图

Javafx写全局快捷键截图,使用jintelltype来注册全局快捷键,在主窗口存在时快捷键生效,但是当把主窗口最小化在后台运行后全局快捷键就不生效了,这怎么解决

看看是不是快捷键已经被另一个程序占用了

该回答引用GPTᴼᴾᴱᴺᴬᴵ
当主窗口最小化在后台运行时,可能会导致快捷键注册失败。这是因为JIntellitype不支持全局快捷键在应用程序最小化时继续生效。为了解决这个问题,您可以使用JavaFX的Stage.setOnHidden()和Stage.setOnShown()方法在应用程序的主窗口最小化和重新显示时重新注册和注销全局快捷键。
·
下面是一个简单的示例代码,演示如何使用JIntellitype和JavaFX编写全局快捷键截图应用程序:

import com.melloware.jintellitype.JIntellitype;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.scene.robot.Robot;
import javafx.stage.Stage;

public class ScreenshotApp extends Application {

    private static final int GLOBAL_HOTKEY_ID = 1;
    private Robot robot;

    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox root = new VBox();
        Button captureButton = new Button("Capture");
        captureButton.setOnAction(event -> {
            Image screenshot = captureScreenshot();
            // do something with the screenshot...
        });
        root.getChildren().add(captureButton);
        primaryStage.setScene(new Scene(root, 300, 200));
        primaryStage.show();

        // register global hotkey
        JIntellitype.getInstance().registerHotKey(GLOBAL_HOTKEY_ID, JIntellitype.MOD_CONTROL, (int)'S');
        JIntellitype.getInstance().addHotKeyListener(hotkey -> {
            if (hotkey.getID() == GLOBAL_HOTKEY_ID) {
                Image screenshot = captureScreenshot();
                // do something with the screenshot...
            }
        });

        // initialize Robot
        robot = new Robot();
        robot.setAutoWaitForIdle(true);

        // unregister global hotkey when application is hidden
        primaryStage.setOnHidden(event -> {
            JIntellitype.getInstance().unregisterHotKey(GLOBAL_HOTKEY_ID);
        });

        // register global hotkey when application is shown
        primaryStage.setOnShown(event -> {
            JIntellitype.getInstance().registerHotKey(GLOBAL_HOTKEY_ID, JIntellitype.MOD_CONTROL, (int)'S');
        });
    }

    private Image captureScreenshot() {
        WritableImage screenshot = robot.getScreenCapture(null, null);
        SnapshotParameters params = new SnapshotParameters();
        params.setFill(javafx.scene.paint.Color.TRANSPARENT);
        return screenshot.snapshot(params, null);
    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void stop() throws Exception {
        // unregister global hotkey and clean up resources
        JIntellitype.getInstance().unregisterHotKey(GLOBAL_HOTKEY_ID);
        JIntellitype.getInstance().cleanUp();
        super.stop();
    }
}


在上面的示例中,我们使用JIntellitype注册了全局热键,以便在应用程序最小化时仍然可以使用快捷键。Robot类用于获取屏幕截图,SnapshotParameters类用于在屏幕截图时设置透明背景。setOnHidden()和setOnShown()方法用于在应用程序最小化和重新显示时重新注册和注销全局热键。setOnHidden()方法在应用程序的主窗口最小化时触发,我们在其中注销全局热键以确保热键不再生效。setOnShown()方法在应用程序的主窗口重新显示时触发,我们在其中重新注册全局热键以便重新启用热键。这种方法可以确保当应用程序最小化时全局热键不会干扰其他应用程序,同时在应用程序重新显示时保持全局热键的可用性。