windows - 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) 中执行此操作?
解决方案
推荐阅读
- python - 如何读取和替换文本文件的一列中的特定值?
- shell - 当脚本是可执行文件时 os.listdir 的问题
- laravel - 如何指定要导入的 excel 行数
- python - RuntimeError: 图表已完成,无法修改
- php - 一页不同的图片上传形式
- kubernetes - kubernetes 无法通过 pod 内部的 ip 访问其他机器
- xamarin.forms - 子菜单项出现在底栏上而不是浮出控件内
- flutter - 如何在下拉菜单上添加文字?
- flutter - 如何使用 Google Maps Flutter 默认显示地图标签
- html - 我想使用 CSS 正确设置文本的背景颜色。它没有像我预期的那样反应