質問はHow to pass mouse events to applications behind mine in C#/Vista?と全く同じですが、私は透過Java UIの場合と同じものが必要です。私は簡単に6.0を使って透明なJava UIを作成することができますが、アプリケーションを介してイベントをアプリケーション(ブラウザなど)に渡すことについての情報は得られませんでした。Java UIの背後にあるアプリケーションにマウスイベントを渡します
答えて
これはあなたの質問に答えてくれると思います。これを実行するには、Java 6 update 10以上が必要です。 私は、そうでない場合、コードは動作しませんあなたが装飾のないウィンドウや単体のJava(デフォルト以外のOSの装飾)で飾られているものを持っているいずれかの必要がある注
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ClickThrough {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame f = new JFrame("Test");
f.setAlwaysOnTop(true);
Component c = new JPanel() {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g.create();
g2.setColor(Color.gray);
int w = getWidth();
int h = getHeight();
g2.fillRect(0, 0, w,h);
g2.setComposite(AlphaComposite.Clear);
g2.fillRect(w/4, h/4, w-2*(w/4), h-2*(h/4));
}
};
c.setPreferredSize(new Dimension(300, 300));
f.getContentPane().add(c);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
com.sun.awt.AWTUtilities.setWindowOpaque(f,false);
}
}
のWindows Vista上でそれをテストしました。
Robot Class http://java.sun.com/javase/6/docs/api/java/awt/Robot.htmlを使用すると、システムイベントを低レベルのオペレーティングシステム、特にマウスイベントなどに指定できます。
を渡す必要がありますjavaフレームは再びイベントを受信しますか? – Varun
あなたはガラスの区画(これについてはJavaのチュートリアルを読んでください)でさえ把握して、単にイベントを消費することができます。 –
一時的にウィンドウを非表示にすることができます。それは私が知っているいくつかのちらつきを紹介しますが、私は他の何かを考えることができません.... –
Java 1.6.0_31を使用してMacOS X 10.7.3でSavvasの回答が完全に助けられました。ありがとう! 唯一の事:私はさらにこれが答えではない
f.setUndecorated(true);
を設定しなければならなかったが、受け入れ答えに危険な問題を修正するアップデートだけでなく、Javaの7+
と互換性の例を提供しますPer-Pixel alpheringは、ウィンドウ内の各ピクセルをチェックして透明かどうかを判定します。透明であれば、マウスイベントは通過できます。透明でない場合、マウスイベントはウィンドウによって捕捉されます。これは一般的にOSレベルの問題です。
この例では、実際にいくつかの非常に危険なことを行っていますが、最初は不透明なコンポーネントに半透明の色を塗りつぶしています。つまり、コンポーネントの下に何かをペイントする必要があり、スウィングは不透明で透明なコンポーネントのみを知っているため、半透明のコンポーネントについてはわからないため、APIを騙す必要があります。
カスタムペイントを実行するときは、ペイントする前にGraphics
コンテキストが正しく設定されていることを確認するために、常にsuper.paintComponent
を呼び出す必要があります。あなたのケースでは、あなたもsetOpaque
を使用してコンポーネントを透明にし、それをロボットがシステムイベントを生成するための私の透明フレームは、私はクリックする必要が場所になっていないでしょうであれば使用することができますfalse
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestFrame {
public static void main(String[] args) {
new TestFrame();
}
public TestFrame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setAlwaysOnTop(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setOpaque(false);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.BLUE);
g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
g2d.dispose();
}
}
}
- 1. spring-securityの背後にあるspringfox swagger-uiにアクセスする
- 2. プロキシの背後にあるJavaソケットプログラミング
- 3. MSVC++で新しいアプリケーションを開き、マウスイベントを渡します
- 4. SVGの背景を介したマウスイベントの受け渡し
- 5. java - スタンドアロンJavaアプリケーションからのマウスイベントのキャプチャ
- 6. ホストの背後にあるnginxの背後にあるタワー
- 7. Wordpressの背後にあるRailsアプリケーションfastcgi_intercept_errorsを使用して
- 8. IISの背後にあるHTTPサーバー:認証ヘッダーを渡します。
- 9. Java InputStreamの背後にあるファイルのバイト数を取得します
- 10. 別のアプリケーションの背後にあるウィンドウを開く
- 11. Nollyxの背後にあるアプリケーションにGolangリバースプロキシ
- 12. ハイパーリンクフィールドを使用して変数の背後にあるコードを渡す方法
- 13. Oracle SSOの背後にあるASP.NETアプリケーション - 匿名アクセス?
- 14. cでコードの背後にあるコードに動的IDを渡した値#
- 15. Javaのオブジェクトクラスの背後にあるメカニズムは何ですか?
- 16. Math.pow()の背後にあるJavaのアルゴリズムは何ですか
- 17. プロキシサーバーの背後にあるラップトップをシミュレート
- 18. httpsウェブページのデータをプロキシの背後にあるJava
- 19. インターネットプロキシの背後にあるアプリケーションで逆プロキシとしてhaproxyを使用する
- 20. マウスイベントの背景色を変更する
- 21. jmxを使用してELBの背後にあるtomcat Webアプリケーション(ec2)にアクセス
- 22. NATの背後にあるCORBAクライアント
- 23. C#コードの背後にある配列(またはTList)を外部のJavaScriptに渡しますか?
- 24. AWTのJava Thread PoolingとJava EventQueueの背後にある概念に類似点はありますか?
- 25. クラスの背後にあるネイティブコードに反応します
- 26. Amazon ELBの背後にあるNodeJsアプリケーション502
- 27. コードの背後にコントロールを作成し、xamlに渡す
- 28. amazon elbの背後にあるjavaサーバーを使用してhttpとhttpsにリダイレクト
- 29. Alfrescoリバースプロキシの背後にあるログインエラーを共有します
- 30. std :: stackの背後にあるコンテナを取得します。
は、jdk 1.6、Windows 7の1.7、JDK 1.6、XPの1.7でよくクリックスルーできるようです。しかし、他のOSについてはわかりません... – rogerdpack
これは危険な例です。不透明なコンポーネントの透明度を "偽造"しようとすると、グラフィックゴーストやその他のグラフィックアーチファクトが発生する可能性があります。私は、 'setOpaue'を使って' Component''c'を透明にし、 'false'を渡すだけで、もっと簡単で良い解決法でした。あなたもペイントチェーンを壊してしまった – MadProgrammer