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

查看 158|回复 14
作者:garywill   
项目背景: https://github.com/garywill/vimouse 一个键盘代替鼠标点击的软件

需要在整个桌面上显示许多不连续的“块”
同时要求:
[ol]

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

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

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

  • 跨平台(肯定要分别调用平台的 api 了)
    [/ol]目前,项目已经 python+tkinter 做到可用了,但实际上是用了一个全屏无边框窗口,在已截好的屏幕截图上画“块”,是不透明的,鼠标点击也无法穿过
    开发语言希望继续使用 python ,GUI 换用 qt 或其他也行
    或许听起来有点刁钻啊。。大神们有没有主意呢?

    窗口, 鼠标, Python, 穿过

  • b821025551b   
    用 tk 就别想了,不过有骚操作:鼠标抬起的时候,你这个窗体最小化,操作鼠标进行点击就行了。
    codehz   
    windows 下直接给整个窗口设置 WS_EX_TRANSPARENT 就可以了
    防止截图可以尝试用 SetWindowDisplayAffinity 里的参数 WDA_EXCLUDEFROMCAPTURE
    上面都是可以直接对窗口句柄执行的操作,框架能提供 hwnd 就能用
    garywill
    OP
      
    @b821025551b 目前的确是在预备点击的时候隐藏窗口。不过,需要延时再触发点击
    garywill
    OP
      
    @codehz 对了想到一件事。如果防止了截图,那么截图出来是黑块呢还是窗口后面的内容呢?希望截出来是后面 app
    lisxour   
    你说的这些在 windows 都很好实现,包括截图,但是跨平台难度就很高了。
    lisxour   
    @lisxour 在别的平台你最好做好无法实现的准备。
    codehz   
    mac 的话大概可以 https://developer.apple.com/documentation/appkit/nswindow/1419354-ignoresmouseevents?language=objc
    x11 可以 XFixesSetWindowShapeRegion 设置一个 0 宽度的 region 即可
    wayland 也是类似思路,设置 0 尺寸 region ,但是这个恐怕不是那么容易做(
    codehz   
    @garywill 不透明窗口的话是黑的(
    透明的,我不确定,可能也黑了
    misdake   
    qt 的话,设置透明背景 translucentbackground (顺带设置 framelesswindow ),设置鼠标事件透明 transparentformouseevents ,好像就行了
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部