我的问题本质上是在Java中是否有一种方法可以在屏幕上显示某种类型的无法选择的覆盖图。 “不可选择”的意思是,例如,如果我将JWindow / JFrame覆盖在另一个进程的窗口上,则仍可以照常与该窗口交互,但是我可以在JWindow / JFrame顶部显示内容同时打开窗口。

仅创建一个组件并将以下标志AutoRequestFocus / Focusable / Enabled设置为false并不能达到我的目标,因为该覆盖会阻止鼠标单击其背后的任何内容。

这将在Windows系统上,但最好不限于OS。

最佳答案

我可以看到的唯一选择是使用JNA,并且可以使用。
您必须参考JNA

public class Main
{
    public static void main(String[] args)
    {
        TestFrame frame = new TestFrame();
        frame.setVisible(true);
        WinDef.HWND hwnd = User32.INSTANCE.FindWindow("SunAwtFrame", "Transparent Window");

        int wl =  User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE);
        wl = wl | 0x80000 | 0x20;
        User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl);
    }

    public static long getHWnd(Frame f) {
        return f.getPeer() != null ? ((WComponentPeer) f.getPeer()).getHWnd() : 0;
    }

    static class TestFrame extends JFrame
    {
        public TestFrame()
        {
            super("Transparent Window");
            setUndecorated(true);
            setBackground(new Color(0, 0, 0, 0));
            setAlwaysOnTop(true);
            setSize(800, 600);
            // Without this, the window is draggable from any non transparent
            // point, including points  inside textboxes.
            getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);

            getContentPane().setLayout(new java.awt.BorderLayout());
            getContentPane().add(new JTextField("text field north"), java.awt.BorderLayout.NORTH);
            getContentPane().add(new JTextField("text field south"), java.awt.BorderLayout.SOUTH);
        }

        @Override
        public void paint(Graphics g)
        {
            super.paint(g);
            g.setColor(Color.BLUE);
            g.fill3DRect(0,0,100,100,false);
        }
    }
}

09-10 06:51
查看更多