pywin32 实现的鼠标后台点击功能略有不足

2023-09-12 20:05:44 +08:00
 lon91ong

主要参考, 使用 pywin32 的 SendMessage 函数实现,函数定义如下:

from win32.win32gui import SendMessage
# 定义鼠标事件的参数
MK_LBUTTON = 1 # 鼠标左键, 右键为 2
MOUSE_MOVE = 512 #0x0001  # 鼠标移动
MOUSE_LEFTDOWN = 513 #0x0002  # 左键按下
MOUSE_LEFTUP = 514 #0x0004  # 左键释放
def bkg_click(hWnd, coord, count = 1, drag = False, delta = 0):
	# hWnd 窗口句柄,coord 相对坐标,drag 拖动与否,delta 拖动量,count 点击次数
	x, y = int(coord[0]), int(coord[1])
	while count > 0:
		lParam = x | y <<16
		SendMessage(hWnd, MOUSE_LEFTDOWN, MK_LBUTTON, lParam)
		if drag:
			lParam = x | (y + delta) <<16
			SendMessage(hWnd,MOUSE_MOVE, MK_LBUTTON, lParam)
		SendMessage(hWnd, MOUSE_LEFTUP, None, lParam)
		sleep(0.3)
		count -= 1

美中不足之处在于,点击事件发送时会激活窗口,会抢夺活动窗口权限,影响电脑的其它操作

请教大侠有没有更完美的 后台 鼠标事件发送方法

1637 次点击
所在节点    Python
17 条回复
zictos
2023-09-12 20:40:19 +08:00
大漠插件
kkk9
2023-09-12 21:04:47 +08:00
调用驱动后台
ysc3839
2023-09-12 21:27:16 +08:00
PostMessage 呢? LockSetForegroundWindow 呢?
GeekGao
2023-09-12 21:45:11 +08:00
PostMessage
owen800q
2023-09-12 21:47:36 +08:00
用大漠插件
lon91ong
2023-09-13 13:13:22 +08:00
根据上面几位的回复进行了一番搜索,结果如下:

> 大漠插件限制 32 为 python ,我的 python 环境迁移到 64 位平台已经很久了,不想再折腾回去

> PostMessage 试过了,直接替换 SendMessage 函数,其它都不变,然后鼠标乱点,似乎坐标错乱了,不明白跟 SendMessage 的坐标换算有啥不兼容的地方

> LockSetForegroundWindow 根据[微软的介绍]( https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-locksetforegroundwindow)是给前台程序用的,跟我这个要求不符
ohmyhaha
2023-09-13 13:26:16 +08:00
我插个眼。蹲一个方案
lon91ong
2023-09-13 14:38:40 +08:00
更新一下反馈信息,上面关于 PostMessage 替换 SendMessage 的反馈有误,用 PostMessage 替换后程序表现不是坐标错乱,而是跟 SendMessage 一样会抢活动窗口权限

另外补充一点,用两个脚本进程分别监控两个窗口,只有一个进程会抢活动窗口权限,另外一个不抢,同样的代码,好奇怪
lon91ong
2023-09-13 15:04:45 +08:00
再补充一点,没有使用多线程,就是直接打开了两个命令行窗口,分别运行两个脚本实例,一个抢一个不抢
zaw
2023-09-13 16:03:20 +08:00
以前也研究过,太麻烦了,最后还是选大漠插件,虽然只能 32 位 python ,但影响不大,电脑上多版本 python 外加 env 独立环境
lon91ong
2023-09-15 14:13:43 +08:00
今天为了测试兼容性把代码复制了一份整了两个文件夹( 3.10 和 3.11 各一个),脚本分开跑之后不抢窗口焦点了
用的是 PostMessage 方法
lon91ong
2023-09-16 09:56:57 +08:00
一切都是幻觉,今天又抢焦点了
lon91ong
2023-09-18 20:14:18 +08:00
用多进程(multiprocessing)解决了
很奇怪的毛病,开两个命令行窗口分别运行就会有一个抢焦点,同样的代码用 multiprocessing 就不抢了
lon91ong
2023-09-19 13:51:25 +08:00
然并卵,就昨天一会儿好用,今天重开依旧是一个抢一个不抢

控制变量,折腾了半天,现在不抢了,还是一头雾水
lon91ong
2023-09-19 13:53:41 +08:00
lon91ong
211 天前
https://bbs.125.la/thread-14804647-2-1.html
问题归结于浏览器窗口的问题,小程序也是 Chrome 核心的,凡是 Chrome 核心的都不行
换用 Firefox 就可以完全后台了
lon91ong
210 天前
还有用 Python 服务油猴 js 提供键鼠输入的思路,在吾爱破解那边,1734053

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

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

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

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

© 2021 V2EX