pywin32调用Sendmessage()时与uiautomation的冲突

博客作者在使用 Python 的 win32 库和 uiautomation 库时发现了一个冲突问题。当同时导入这两个库并尝试使用 win32gui.SendMessage 函数模拟鼠标点击时,代码执行但未产生预期的鼠标点击效果。然而,移除 uiautomation 库后,模拟鼠标点击的功能恢复正常。进一步的测试表明,uiautomation 库可能只影响到 SendMessage 的鼠标模拟功能,而不影响按键信息的发送。这个问题对其他 SendMessage 功能的影响尚不明确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写代码进行测试的时候突然发现基于win32的SendMessage实现模拟鼠标代码没有实现意料中的效果,但经过检查以后这条代码确实被执行了。

在经过长达两个多小时的检查以后,我发现问题主要出现在这个地方

import win32con
import win32gui
import uiautomation
win32gui.SendMessage(132082,win32con.WM_LBUTTONDOWN, 0x01, 4718980)
win32gui.SendMessage(132082,win32con.WM_LBUTTONUP, 0x01, 4718980)

这段代码表面上看起来没有问题,但是经测试发现两句SendMessage函数虽然运行了但是没有产生应有的效果。而以下的代码却能正常运行。

import win32con
import win32gui
win32gui.SendMessage(132082,win32con.WM_LBUTTONDOWN, 0x01, 4718980)
win32gui.SendMessage(132082,win32con.WM_LBUTTONUP, 0x01, 4718980)

 我的项目中同时导入了win32模块和uiautomation模块,在删除导入uiautomation模块后程序可以成功地模拟鼠标点击。初步断定是win32库和uiautomation库产生了冲突,但具体原因不明。

在我的程序中还有另一部分代码使用了SendMessage函数。但是却成功运行。为了进一步了解这种冲突的影响,进行了如下实验

一、通过SengMessage函数模拟鼠标点击

import win32con
import win32gui
import uiautomation
win32gui.SendMessage(132082,win32con.WM_LBUTTONDOWN, 0x01, 4718980)
win32gui.SendMessage(132082,win32con.WM_LBUTTONUP, 0x01, 4718980)
import win32con
import win32gui
win32gui.SendMessage(132082,win32con.WM_LBUTTONDOWN, 0x01, 4718980)
win32gui.SendMessage(132082,win32con.WM_LBUTTONUP, 0x01, 4718980)

 结果:第一串代码未报错,但未实现鼠标点击;第二串代码成功实现鼠标点击

二、通过SendMessage函数向窗口发送剪切板信息和按键点击信息

import win32con
import win32clipboard
import win32gui
import uiautomation
#向剪切板发送信息
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, '开始测试')
win32clipboard.CloseClipboard()
#向窗口发送剪切板粘贴信息
win32gui.SendMessage(1445216, win32con.WM_PASTE, 0, 0)
#向窗口发送案件ENTER被按下的信息
win32gui.SendMessage(1445216, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
import win32con
import win32clipboard
import win32gui
#向剪切板发送信息
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, '开始测试')
win32clipboard.CloseClipboard()
#向窗口发送剪切板粘贴信息
win32gui.SendMessage(1445216, win32con.WM_PASTE, 0, 0)
#向窗口发送案件ENTER被按下的信息
win32gui.SendMessage(1445216, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

结果:第一串代码成功运行;第二串代码也成功运行

总结:uiautomation库与win32模块中的SendMessang函数产生了冲突,具体表现是无法模拟鼠标点击信息,但是按键按下信息等并无影响。(如果其他功能也产生了冲突欢迎在评论区补充)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰宝IWZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值