2016-08-02 5 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で実行することは可能ですか?たとえそれがOSごとのソリューションであっても。

+0

:後

は、この機能を実証実施例です。 :) thats fishy。それは可能です。しかし、なぜ – Elltz

+0

このツール(http://bytefreaks.net/applications/on-screen-clockcount-downcounter-version-3-java)にこの機能を追加したいのですが、それは時間を表示するアプリケーションのようなウィジェットです。私はそれを目に見えるように、角の上に置いて、それをクリックすることで、いつも動かす必要がないようにしたい。 –

答えて

1

Windowsでこの操作を実行する方法は、user32.dllとJavaネイティブアクセス(JNA)です。 GetWindowLongを使用してウィンドウの現在の設定を取得し、SetWindowLongを使用してウィンドウの機能を制御するビットフィールドをマウスに対して透明に更新しました。あなたは他のアプリを入力fliterにしたいように見える、というのでしょうなぜ

@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); 
} 
関連する問題