2016-08-02 56 views
0

我有一個JavaFx應用程序,它加載了一些透明的舞臺上的文字。允許點擊通過應用程序GUI

我希望任何點擊應用程序被完全忽略,並且後臺應用程序(如果有的話)接收該點擊。

我在這個階段的代碼如下:

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中可以實現這個嗎?即使它是一個per-OS解決方案。

+0

爲什麼你想的是,看起來像要郝曉紅另一個應用程序的輸入。 :)多數民衆贊成在腥。儘管如此。但爲什麼 – Elltz

+0

我想將此功能添加到此工具(http://bytefreaks.net/applications/on-screen-clockcount-downcounter-version-3-java),它是一個像應用程序那樣的顯示時間的小部件。我希望它是可見的,在一個角落頂部,並允許我點擊它,這樣我就不必一直移動它。 –

回答

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); 
} 
相關問題