python模块虽多,也不可能满足开发者的所有需求。而且,模块为了便于使用,通常都封装过度,有些功能无法灵活使用,必须直接调用Windows API来实现。而模块pywin32可以解决这个问题,它直接包装了几乎所有的Windows API,可以方便地从Python直接调用,该模块另一大主要功能是通过Python进行COM编程。
可以直接打开cmd命令窗口使用pip执行命令pip install pywin32来安装它。
有什么问题可以去我的主页看看如何安装的。
安装完毕后,在Python安装路径下的Lib\site-packages\win32可以看到所有的API支撑模块,在Lib\site-packages\win32com下则是COM支撑模块。
在Lib\site-packages下有一个PyWin32.chm帮助文档,相信对编程有一定基础的看了这个帮助文档就能很快上手。
import win32gui
import win32con
import win32clipboard as w
import time
def send(name, msg):
#打开剪贴板
w.OpenClipboard()
#清空剪贴板
w.EmptyClipboard()
#设置剪贴板内容
w.SetClipboardData(win32con.CF_UNICODETEXT, msg)
#获取剪贴板内容
date = w.GetClipboardData()
#关闭剪贴板
w.CloseClipboard()
#获取qq窗口句柄
handle = win32gui.FindWindow(None, name)
if handle == 0:
print('未找到窗口!')
#显示窗口
win32gui.ShowWindow(handle,win32con.SW_SHOW)
#把剪切板内容粘贴到qq窗口
win32gui.SendMessage(handle, win32con.WM_PASTE, 0, 0)
#按下后松开回车键,发送消息
win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
time.sleep(1)#延缓进程
def main():
name = '言墨'#QQ聊天窗口的名字
print('开始')
for i in range(1, 11):
send(name, '第'+str(i)+'次测试')
print('结束')
main()
将数据以指定的剪贴板格式放在剪贴板上。窗口必须是当前剪贴板的所有者,应用程序必须先调用OpenClipboard函数。
1、format:int
用来指定要放到剪切板中的数据的格式。其可以定义的格式如下:
2、hMem:int/buffer
指定格式的数据、字符串、unicode或任何支持缓冲区接口的对象的整数句柄。分配一个全局内存对象,并将该对象的缓冲区复制到新内存中。此参数可以为0,表示窗口在请求时提供指定剪贴板格式的数据(呈现格式)。
如果函数成功,返回的值是数据的int型句柄。
如果函数失败,则使用GetLastError信息引发win32api.error 。
检索类名和窗口名匹配指定字符串的顶级窗口的句柄。ClassName参数指向类名,WindowName指向窗口名,如果有指定的类名和窗口名则表示成功返回一个窗口的句柄。否则返回零。
1、ClassName:PyResourceId
指向一个用来指定类名的字符串或一个可以确定类名字符串的原子。如果该参数为None时,将会寻找任何与WindowName参数匹配的窗口。
2、WindowName:string
指向一个用来指定窗口名(即窗口标题)的字符串。如果此参数为None,则匹配所有窗口名。
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
显示或隐藏窗口并更改其状态。
1、hWnd:int
指窗口句柄。
2、cmdShow:int
指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中cmdShow参数。在随后的调用中,该参数可以为下列值之一:
如果窗口之前可见,则返回值为非零。如果窗口之前被隐藏,则返回值为零。
该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。
1、hwnd:int
指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
2、Msg:int
指定被发送的消息。
3、wparam:int/str
指定附加的消息特定信息。
4、Iparam:int/str
指定附加的消息特定信息。
具体的参数取值可以参考一下百度百科的内容:https://baike.baidu.com/item/SendMessage/6374103?fr=aladdin
首先的要求是要打开QQ聊天对话窗口,也不能最小化,然后运行程序,得到下图的测试结果:
经过多次测试发现,在把剪贴板内容粘贴到消息发送框时总有几次会失败,目前找不到原因,解决方法就是只能多次循坏来保证消息发送成功。