首页 > 解决方案 > Windows alpha 合成 XOR 模式

问题描述

我想直接在 Windows 屏幕上绘制文本。文本应该可以从从该屏幕截取的屏幕截图中删除。

这里有一个例子给你一个想法:

    static final Color color = new Color(1, 1, 1, (float) .6f);
    static float opacity = .6f;
    static Color COL =  Color.BLACK;

    private void showOverlayWindow() {
        final Window w = new Window(null) {
            public void paint(Graphics g) {
                Graphics2D g2d = (Graphics2D) g;
                g2d.setXORMode(color);
                g2d.setColor(COL);
                g2d.fillRect(0, 0, 300, 100);
                //g2d.fillRect(0, 0, 300, 100);
            }
            public Dimension getPreferredSize() {
                final Dimension dimension = new Dimension(width,height);
                return dimension;
            }
        };

        w.pack();
        w.setBounds(0, 0, width, height);
        w.setLocationRelativeTo(null);
        w.setAlwaysOnTop(true);
        w.setOpacity(opacity);
                w.setBackground(color);
        setClickThrough(w);

        w.setVisible(true);
    }
    private  void setClickThrough(Component w) {
        overlayWindow = getHWnd(w);
        int wl = User32.INSTANCE.GetWindowLong(overlayWindow, WinUser.GWL_EXSTYLE);
        wl = wl | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT;
        User32.INSTANCE.SetWindowLong(overlayWindow, WinUser.GWL_EXSTYLE, wl);
    }

    private  HWND getHWnd(Component w) {
        HWND hwnd = new HWND();
        hwnd.setPointer(Native.getComponentPointer(w));
        return hwnd;
    }

当然,这个例子是行不通的。

第二个 g2d.fillRect() 将擦除前面的操作,但它不考虑覆盖窗口下的位。

为此,我必须为覆盖窗口提供 Porter/Duff 复合操作模式 XOR(请参阅https://www.cairographics.org/operators/)。

如何在 Windows (Win10) 中执行此操作?

标签: windowsjnacompositionporter-duff

解决方案


推荐阅读