概述
再对QQ下手
写了一个自动发消息的,但是测试对象反应,你这个好low 啊。。。。只能发消息,我要发图片。。。。
正好收藏了一篇文章。。。。。
参考 脑补链接
import win32con
import win32api
import win32gui
import win32clipboard as wc
import time
from PIL import Image
from io import BytesIO
def bmp(path):
# path=r'../image library/5.jpg'
img = Image.open(path)
f=BytesIO() # 当然保存成文件再读取也是可以的,只是这样更快
img.convert('RGB').save(f,'BMP') # 转换成位图
data=f.getvalue()[14:] # 至于为啥要舍去文件头的14个字节看下面解析吧
f.close()
wc.OpenClipboard()
wc.EmptyClipboard()
wc.SetClipboardData(win32con.CF_DIB,data)
wc.CloseClipboard()
def settext(text):
wc.OpenClipboard()
wc.EmptyClipboard()
wc.SetClipboardData(win32con.CF_TEXT, text.encode('gbk'))
wc.CloseClipboard()
def searchuser(name):
hand = win32gui.FindWindow('TXGuiFoundation','QQ')
print(hand)
settext(name)
time.sleep(1)
win32gui.SendMessage(hand, win32con.WM_PASTE, 0, 0)
time.sleep(1)
win32gui.SendMessage(hand, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
def formal():
name = input("请输入联系人:")
path=input('图片路径:')
n = int(input("请输入重复消息次数:"))
t = float(input("请输入消息间隔时间/s:"))
searchuser(name)
time.sleep(3)
print('开始')
hand = win32gui.FindWindow('TXGuiFoundation', name)
while True:
if hand != 0:
win32api.Sleep(200)
break
else:
time.sleep(1)
bmp(path)
while(n):
print('剩余%d次'% n)
win32gui.SendMessage(hand, win32con.WM_PASTE, 0, 0)
time.sleep(1)
win32gui.SendMessage(hand, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
n -= 1
time.sleep(t)
print('完成')
if __name__=='__main__':
formal()
可以看到 CF_DIB 保存的是bitmap
众所周知。。。。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
bmp文件头(bmp file header):提供文件的格式、大小等信息(14个字节)
位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据(bitmap data):就是图像数据
所以。。。。前14位就不要了。。
CopyFileEx
anacondaLibsite-packageswin32Demos
自带的一些例子,,来看看吧。。(只挑我能看懂的。。)
win32api.GetTempPath
string = GetTempPath()
检索为临时文件指定的目录的路径。 C:UsersNEROAppDataLocal 应该是这个目录
win32api.GetTempFileName tuple = GetTempFileName(path, prefix ,
nUnique )返回值将创建以下格式的临时文件名:path preuuuu.tmp。 # 就是创建一个临时文件吧。。
Parameters
path : string
指定方法创建临时文件名的路径。 应用程序通常为此参数指定一个句点(。)或GetTempPath函数的结果。
prefix : string
指定临时文件名前缀。
nUnique : int
指定用于创建临时文件名的整数。如果此参数为非零值,则将其附加到临时文件名。如果此参数为零,则Windows将使用当前系统时间来创建一个数字以附加到文件名中。
win32file.CopyFileEx CopyFileEx(ExistingFileName, NewFileName,
ProgressRoutine, Data, Cancel, CopyFlags, Transaction)具有可选进度例程的可重新启动文件副本
Parameters
ExistingFileName : PyUNICODE
要复制的文件
NewFileName : PyUNICODE
它将被复制到的地方
ProgressRoutine=None : CopyProgressRoutine
接收进度更新的python函数可以为None
Data=None : object
传递给回调函数的任意对象
Cancel=False : boolean
传递True以取消先前中断的可重新启动副本
CopyFlags=0 : int
组合COPY_FILE_ *标志
Transaction=None : PyHANDLE
处理由win32transaction :: CreateTransaction返回的事务
Return Value 返回值是(string,int)的元组,其中string是文件名,而rc是用于生成文件名的唯一数字。
import win32file, win32api
import os
def ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred,
StreamNumber, CallbackReason, SourceFile, DestinationFile, Data):
print(Data)
print(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, StreamNumber, CallbackReason, SourceFile, DestinationFile)
##if TotalBytesTransferred > 100000:
## return win32file.PROGRESS_STOP
return win32file.PROGRESS_CONTINUE
temp_dir=win32api.GetTempPath()
fsrc=win32api.GetTempFileName(temp_dir,'cfe')[0]
fdst=win32api.GetTempFileName(temp_dir,'cfe')[0]
print(fsrc, fdst)
f=open(fsrc,'w')
f.write('xxxxxxxxxxxxxxxxn'*32768)
f.close()
## add a couple of extra data streams
f=open(fsrc+':stream_y','w') # 添加一些格外的数据流。。看不懂
f.write('yyyyyyyyyyyyyyyyn'*32768) # 不添加这些文件的大小也是一样的,,这些到哪去了。。。
f.close()
f=open(fsrc+':stream_z','w')
f.write('zzzzzzzzzzzzzzzzn'*32768)
f.close()
# operation_desc='Copying '+fsrc+' to '+fdst
# win32file.CopyFileEx(fsrc, fdst, ProgressRoutine, Data=operation_desc, Cancel=False, CopyFlags=win32file.COPY_FILE_RESTARTABLE, Transaction=None)
win32file.CopyFileEx(fsrc, fdst)
# 复制文件这个就够了。。。那些显示复制进度的我也不指望了。。。
最后
以上就是激昂麦片为你收集整理的pywin32 : 将位图放到剪贴板,文件复制的全部内容,希望文章能够帮你解决pywin32 : 将位图放到剪贴板,文件复制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复