允许点击通过应用程序GUI

时间:2016-08-02 20:03:20

标签: javafx

我有一个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中实现这一目标?即使它是每操作系统解决方案。

1 个答案:

答案 0 :(得分:1)

在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);
}