我是靠谱客的博主 激昂麦片,最近开发中收集的这篇文章主要介绍pywin32 : 将位图放到剪贴板,文件复制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

再对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 : 将位图放到剪贴板,文件复制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部