Дублирующая вставка при использовании виртуальной клавиатуры - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу написать функцию копирования и вставки изображения для ОС Windows приложения моделирования.

Шаг 1: открыть изображение

Шаг 2: запись в clipborad

Шаг 3:используйте win32api.keybd_event, чтобы нажать "ctrl+V"

В результате, около 3% изображения было заменено изображением после предполагаемого значения изображения, и общее количество изображений никогда не изменится.

Моя ОСЭто Windows7 Enterprise Edition.Я думаю, это может быть вызвано задержкой при нажатии "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)

Повторяйте циклы больше, пока не выйдет из строя, возможно, производительность компьютера является одной из причин
Результат показан ниже
идеальный результат
фактический результат

...