允许单击以浏览应用程序GUI



我有一个JavaFx应用程序,它加载了一个带有一些文本的透明阶段。

我希望应用程序上的任何点击都被完全忽略,并且后台应用程序(如果有的话)会收到该点击。

我在这个阶段的代码如下:

public void start(final Stage primaryStage) {
    primaryStage.setAlwaysOnTop(true);
    final StackPane layout = new StackPane();
    final Text mainText = new Text();
    layout.getChildren().add(mainText);
    mainText.setText("|||||||||||||||||||||||||||");
    final Scene mainScene = new Scene(layout);
    mainScene.setFill(null);
    primaryStage.initStyle(StageStyle.TRANSPARENT);
    primaryStage.setScene(mainScene);
    primaryStage.show();
    layout.setMouseTransparent(true);
    mainText.setMouseTransparent(true);
}

我没能达到要求。setMouseTransparent()只是阻止了文本触发事件,它仍然捕获了鼠标点击。

有可能在JavaFx中实现这一点吗?即使是每个操作系统的解决方案。

在Windows中执行此操作的一种方法是通过user32.dll和Java Native Access(JNA)。我们使用GetWindowLong来获取窗口的当前配置,并使用SetWindowLong更新控制窗口对鼠标透明能力的位字段。

以下是演示此功能的工作示例:

@Override
public void start(final Stage primaryStage) {
    primaryStage.setAlwaysOnTop(true);
    final StackPane layout = new StackPane();
    final Text mainText = new Text();
    layout.getChildren().add(mainText);
    mainText.setText("|||||||||||||||||||||||||||");
    final Scene mainScene = new Scene(layout);
    mainScene.setFill(null);
    primaryStage.initStyle(StageStyle.TRANSPARENT);
    primaryStage.setScene(mainScene);
    primaryStage.setTitle(sTitle);
    primaryStage.show();
    sUser32.EnumWindows(
     (hWnd, data) -> {
         final byte[] windowText = new byte[512];
         sUser32.GetWindowTextA(hWnd, windowText, 512);
         final String wText = Native.toString(windowText);
         if (!wText.isEmpty() && wText.equals(sTitle)) {
             final int initialStyle = com.sun.jna.platform.win32.User32.INSTANCE.GetWindowLong(hWnd, WinUser.GWL_EXSTYLE);
             com.sun.jna.platform.win32.User32.INSTANCE.SetWindowLong(hWnd, WinUser.GWL_EXSTYLE, initialStyle | WinUser.WS_EX_TRANSPARENT );
             return false;
         }
         return true;
     }, null);
}

最新更新