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

333 天前
 garywill

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

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

同时要求:

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

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

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

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

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

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

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

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

截图就不一定了。
AlynxZhou
333 天前
githmb
333 天前
ysc3839
333 天前
@codehz WDA_EXCLUDEFROMCAPTURE 不是截图时没有,而是截图时对应区域变黑
yunyuyuan
333 天前
c2const
333 天前
你这需求没别要换语言重写整个 GUI 。
继续用 python ,不能实现的部分调 dll 。
dll 用 QT 或者 win32+纯 C 都行,chatGPT 还可以帮你写大部分代码 :)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/944176

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX