我想为应用程序模拟Windows操作系统编写一个复制和粘贴图像功能。
第一步:打开图片
Step2:写入clipborad
第3步:使用win32api.keybd_event
按下"ctrl+V"
结果,大约3%的图像被替换为假定为的图像,并且图像的总数量永远不会改变。
我的操作系统是Windows7企业版。
我猜可能是由于按"ctrl+V"
时的滞后引起的,但是总图像数是准确的。
当我放慢速度时,重复率会降低,但即使以每秒一幅图像的速度仍然存在。
我还检查剪贴板,win32clipboard.GetClipboardData(win32con.CF_DIB)
在粘贴重复副本时返回不同的值。
import hashlib
import time
import traceback
import win32api
import win32clipboard as clip
from io import BytesIO
import win32con
from PIL import Image
def setImage(data):
m = hashlib.md5()
try:
clip.OpenClipboard()
clip.EmptyClipboard()
clip.SetClipboardData(win32con.CF_DIB, data)
m.update(clip.GetClipboardData(win32con.CF_DIB))
clip.CloseClipboard()
return m.hexdigest()
except:
traceback.print_exc()
setImage(data)
def copyPicMain(imagePath, width = 600, height = 480, internal=0, notResize = False):
m = hashlib.md5()
try:
clip.OpenClipboard()
m.update(clip.GetClipboardData(win32con.CF_DIB))
clip.CloseClipboard()
pre_md5 = m.hexdigest()
except TypeError:
# if clip is empty
traceback.print_exc()
print('empty')
pre_md5 = ''
except:
traceback.print_exc()
clip.OpenClipboard()
m.update(clip.GetClipboardData(win32con.CF_DIB))
clip.CloseClipboard()
pre_md5 = m.hexdigest()
img = Image.open(imagePath)
output = BytesIO()
if not notResize:
img = img.resize((height, width), Image.BILINEAR)
img.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
output.close()
new_md5 = setImage(data)
print(pre_md5, new_md5)
time.sleep(internal)
win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0) # ctrl key code 17
win32api.keybd_event(86, 0, 0, 0) # v key code 86
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # key up
time.sleep(internal)
if __name__ == '__main__':
imagePathList = [r'C:\Users\F1235648\PycharmProjects\copyPic\pic\Picture-007 ANT Polar Power.png',r'C:\Users\F1235648\PycharmProjects\copyPic\pic\Picture-008 LTE Max Power QPSK 12 0.png',r'C:\Users\F1235648\PycharmProjects\copyPic\pic\Picture-009 LTE Max Power QPSK 12 19.png']
for imagePath in imagePathList:
copyPicMain(imagePath)
循环多次直到出现问题,也许是计算机性能下降的原因之一
结果如下所示
ideal result
actual result