项目背景: https://github.com/garywill/vimouse 一个键盘代替鼠标点击的软件
需要在整个桌面上显示许多不连续的“块”
同时要求:
那些块不影响任何鼠标事件(鼠标点击穿过,类似前端的pointer-event: none
)
不显示块的地方,后面其他 app 的显示不受影响(窗口局部真透明)。只能用一个全屏无边框窗口做大面积覆盖,因为如果为每一个块创建一个窗口,必定开销极大
(可选)显示出来的块不会被截图到,即,对截图隐藏。这点不确定能不能实现,作为可选项吧
跨平台(肯定要分别调用平台的 api 了)
目前,项目已经 python+tkinter 做到可用了,但实际上是用了一个全屏无边框窗口,在已截好的屏幕截图上画“块”,是不透明的,鼠标点击也无法穿过
开发语言希望继续使用 python ,GUI 换用 qt 或其他也行
或许听起来有点刁钻啊。。大神们有没有主意呢?
关于「截图时对截图隐藏」这个需求,想了一下,想问几点:
搜索了一下,有人提到放大镜API,有大神用过吗?
有些窗口切换特效的app是可以在窗口并非最前的情况下,实时获得某一窗口的截图的,考虑用它,是否可行呢?
能否做到截图时:
桌面背景图片是黑的
像终端这种本来就有半透明背景功能的窗口,获得一个无半透明效果的截图
窗口阴影之类的东西在截图中没有
1
b821025551b 2023-05-30 13:55:55 +08:00
用 tk 就别想了,不过有骚操作:鼠标抬起的时候,你这个窗体最小化,操作鼠标进行点击就行了。
|
2
codehz 2023-05-30 14:01:54 +08:00
windows 下直接给整个窗口设置 WS_EX_TRANSPARENT 就可以了
防止截图可以尝试用 SetWindowDisplayAffinity 里的参数 WDA_EXCLUDEFROMCAPTURE 上面都是可以直接对窗口句柄执行的操作,框架能提供 hwnd 就能用 |
3
garywill OP @b821025551b 目前的确是在预备点击的时候隐藏窗口。不过,需要延时再触发点击
|
5
lisxour 2023-05-30 14:16:36 +08:00
你说的这些在 windows 都很好实现,包括截图,但是跨平台难度就很高了。
|
7
codehz 2023-05-30 14:24:59 +08:00
mac 的话大概可以 https://developer.apple.com/documentation/appkit/nswindow/1419354-ignoresmouseevents?language=objc
x11 可以 XFixesSetWindowShapeRegion 设置一个 0 宽度的 region 即可 wayland 也是类似思路,设置 0 尺寸 region ,但是这个恐怕不是那么容易做( |
9
misdake 2023-05-30 14:29:29 +08:00 via Android
qt 的话,设置透明背景 translucentbackground (顺带设置 framelesswindow ),设置鼠标事件透明 transparentformouseevents ,好像就行了
|
10
AlynxZhou 2023-05-30 14:37:24 +08:00
1 和 2 基本各个平台都有支持,甚至都不需要分别调 API ,大一点的 toolkit 应该都有现成的封装,比如我之前用 GTK 写的: https://github.com/AlynxZhou/showmethekey/blob/master/showmethekey-gtk/smtk-keys-win.c#L233
截图就不一定了。 |
11
AlynxZhou 2023-05-30 14:39:18 +08:00
|
12
githmb 2023-05-30 14:48:13 +08:00
|
13
ysc3839 2023-05-30 14:50:26 +08:00 via Android
@codehz WDA_EXCLUDEFROMCAPTURE 不是截图时没有,而是截图时对应区域变黑
|
14
yunyuyuan 2023-05-30 14:54:21 +08:00
|
15
c2const 2023-05-30 17:02:25 +08:00
你这需求没别要换语言重写整个 GUI 。
继续用 python ,不能实现的部分调 dll 。 dll 用 QT 或者 win32+纯 C 都行,chatGPT 还可以帮你写大部分代码 :) |