V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
garywill
V2EX  ›  Python

如何在屏幕上显示一局部透明、鼠标点击可穿过的窗口

  •  
  •   garywill ·
    garywill · 303 天前 · 1996 次点击
    这是一个创建于 303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目背景: https://github.com/garywill/vimouse 一个键盘代替鼠标点击的软件

    需要在整个桌面上显示许多不连续的“块”

    同时要求:

    1. 那些块不影响任何鼠标事件(鼠标点击穿过,类似前端的pointer-event: none

    2. 不显示块的地方,后面其他 app 的显示不受影响(窗口局部真透明)。只能用一个全屏无边框窗口做大面积覆盖,因为如果为每一个块创建一个窗口,必定开销极大

    3. (可选)显示出来的块不会被截图到,即,对截图隐藏。这点不确定能不能实现,作为可选项吧

    4. 跨平台(肯定要分别调用平台的 api 了)

    目前,项目已经 python+tkinter 做到可用了,但实际上是用了一个全屏无边框窗口,在已截好的屏幕截图上画“块”,是不透明的,鼠标点击也无法穿过

    开发语言希望继续使用 python ,GUI 换用 qt 或其他也行

    或许听起来有点刁钻啊。。大神们有没有主意呢?

    第 1 条附言  ·  303 天前

    关于「截图时对截图隐藏」这个需求,想了一下,想问几点:

    1. 搜索了一下,有人提到放大镜API,有大神用过吗?

    2. 有些窗口切换特效的app是可以在窗口并非最前的情况下,实时获得某一窗口的截图的,考虑用它,是否可行呢?

    3. 能否做到截图时:

      • 桌面背景图片是黑的

      • 像终端这种本来就有半透明背景功能的窗口,获得一个无半透明效果的截图

      • 窗口阴影之类的东西在截图中没有

    15 条回复    2023-05-30 17:02:25 +08:00
    b821025551b
        1
    b821025551b  
       303 天前
    用 tk 就别想了,不过有骚操作:鼠标抬起的时候,你这个窗体最小化,操作鼠标进行点击就行了。
    codehz
        2
    codehz  
       303 天前
    windows 下直接给整个窗口设置 WS_EX_TRANSPARENT 就可以了
    防止截图可以尝试用 SetWindowDisplayAffinity 里的参数 WDA_EXCLUDEFROMCAPTURE
    上面都是可以直接对窗口句柄执行的操作,框架能提供 hwnd 就能用
    garywill
        3
    garywill  
    OP
       303 天前
    @b821025551b 目前的确是在预备点击的时候隐藏窗口。不过,需要延时再触发点击
    garywill
        4
    garywill  
    OP
       303 天前
    @codehz 对了想到一件事。如果防止了截图,那么截图出来是黑块呢还是窗口后面的内容呢?希望截出来是后面 app
    lisxour
        5
    lisxour  
       303 天前
    你说的这些在 windows 都很好实现,包括截图,但是跨平台难度就很高了。
    lisxour
        6
    lisxour  
       303 天前
    @lisxour 在别的平台你最好做好无法实现的准备。
    codehz
        7
    codehz  
       303 天前
    mac 的话大概可以 https://developer.apple.com/documentation/appkit/nswindow/1419354-ignoresmouseevents?language=objc
    x11 可以 XFixesSetWindowShapeRegion 设置一个 0 宽度的 region 即可
    wayland 也是类似思路,设置 0 尺寸 region ,但是这个恐怕不是那么容易做(
    codehz
        8
    codehz  
       303 天前
    @garywill 不透明窗口的话是黑的(
    透明的,我不确定,可能也黑了
    misdake
        9
    misdake  
       303 天前 via Android
    qt 的话,设置透明背景 translucentbackground (顺带设置 framelesswindow ),设置鼠标事件透明 transparentformouseevents ,好像就行了
    AlynxZhou
        10
    AlynxZhou  
       303 天前
    1 和 2 基本各个平台都有支持,甚至都不需要分别调 API ,大一点的 toolkit 应该都有现成的封装,比如我之前用 GTK 写的: https://github.com/AlynxZhou/showmethekey/blob/master/showmethekey-gtk/smtk-keys-win.c#L233

    截图就不一定了。
    githmb
        12
    githmb  
       303 天前
    ysc3839
        13
    ysc3839  
       303 天前 via Android
    @codehz WDA_EXCLUDEFROMCAPTURE 不是截图时没有,而是截图时对应区域变黑
    c2const
        15
    c2const  
       303 天前
    你这需求没别要换语言重写整个 GUI 。
    继续用 python ,不能实现的部分调 dll 。
    dll 用 QT 或者 win32+纯 C 都行,chatGPT 还可以帮你写大部分代码 :)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1544 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:04 · PVG 01:04 · LAX 10:04 · JFK 13:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.