UI自动化控制微信发送文件【解决了一个无人回答的难题,Pywin32设置文件到剪切板

//注意用\0分隔多个路径
TCHAR szFiles[300] = _T(“natives_blob.bin\0snapshot_blob.bin\0locales\0”);
if (OpenClipboard(hWnd)) {
EmptyClipboard();
// DROPFILES的头文件Shlobj.h
int nSize = sizeof(DROPFILES) + sizeof(szFiles);
HANDLE hData = GlobalAlloc(GHND, nSize);

LPDROPFILES pDropFiles = (LPDROPFILES)GlobalLock(hData);
pDropFiles->pFiles = sizeof(DROPFILES);
#ifdef UNICODE
pDropFiles->fWide = TRUE;
#else
pDropFiles->fWide = FALSE;
#endif
LPBYTE pData = (LPBYTE)pDropFiles + sizeof(DROPFILES);
CopyMemory(pData, szFiles, sizeof(szFiles));
GlobalUnlock(hData);
SetClipboardData(CF_HDROP, hData);
CloseClipboard();
}

可以看到本质上复制文件操作是向剪切版写入了CF_HDROP类型的消息,消息内容为DROPFILES和路径组成的字节,路径由Unicode编码的字节组成。

那么借助win32clipboard,我们只需要组织出这样的字节数据即可。

参考:

DROPFILES的结构:

typedef struct _DROPFILES {
DWORD pFiles;
POINT pt;
BOOL fNC;
BOOL fWide;
} DROPFILES, *LPDROPFILES;

参考:https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/ns-shlobj_core-dropfiles

和:

typedef struct tagPOINT {
LONG x;
LONG y;
} POINT, *PPOINT;

参考:https://docs.microsoft.com/en-us/previous-versions/dd162805(v=vs.85)

可以合并成一个结构体:

typedef struct _DROPFILES {
DWORD pFiles;
LONG x;
LONG y;
BOOL fNC;
BOOL fWide;
} DROPFILES, *LPDROPFILES;

再结合下面两行C++代码,一起翻译为了python:

pDropFiles->pFiles = sizeof(DROPFILES);
pDropFiles->fWide = TRUE;

注意:只考虑使用Unicode编码的情况,兼容中文。

from ctypes import *

class DROPFILES(Structure):
fields = [
(“pFiles”, c_uint),
(“x”, c_long),
(“y”, c_long),
(“fNC”, c_int),
(“fWide”, c_bool),
]

pDropFiles = DROPFILES()
pDropFiles.pFiles = sizeof(DROPFILES)
pDropFiles.fWide = True

转换为字节:

bytes(pDropFiles)

b’\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00’

对于多个文本路径,我们如何将其转换为需要的Unicode双字节形式呢?

首先,我们必须清楚Unicode编码采用UCS-2格式直接存储,而UTF-16完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式直接保存下来。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。UTF-16通过在文件开头以名为BOM(Byte Order Mark,U+FEFF)的字符来表明文件是Big Endian还是Little Endian。

Python支持的编码表:https://docs.python.org/zh-cn/3/library/codecs.html?#standard-encodings

我们只需要将python字符串使用UTF-16编码后去掉开头两个字节即可得到对应的Unicode双字节。

先测试复制两个文件:

file = ‘D:\tmp\test.txt\0D:\tmp\股票数据.xlsx\0\0’
data = file.encode(“U16”)[2:]

win32clipboard.OpenClipboard()
try:
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(
win32clipboard.CF_HDROP, bytes(pDropFiles)+data)
finally:
win32clipboard.CloseClipboard()

执行以上代码后,尝试在微信输入框粘贴:

image-20211006211839750

点击发送测试一下:

image-20211006211831815

可以看到正斜杠分隔的文件路径发送出来的文件不正常,我们应该将文件路径统一封装成反斜杠的形式。

最终封装的方法如下:

import win32clipboard
from ctypes import *

class DROPFILES(Structure):
fields = [
(“pFiles”, c_uint),
(“x”, c_long),
(“y”, c_long),
(“fNC”, c_int),
(“fWide”, c_bool),
]

pDropFiles = DROPFILES()
pDropFiles.pFiles = sizeof(DROPFILES)
pDropFiles.fWide = True
matedata = bytes(pDropFiles)

def setClipboardFiles(paths):
files = (“\0”.join(paths)).replace(“/”, “\”)
data = files.encode(“U16”)[2:]+b"\0\0"
win32clipboard.OpenClipboard()
try:
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(
win32clipboard.CF_HDROP, matedata+data)
finally:
win32clipboard.CloseClipboard()

def setClipboardFile(file):
setClipboardFiles([file])

def readClipboardFilePaths():
win32clipboard.OpenClipboard()
paths = None
try:
return win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
finally:
win32clipboard.CloseClipboard()

至此我们就通过pywin32实现了修改剪切板的内容为指定文件。

完善自动发消息功能

下面我们继续完善之前的程序,前面的发送功能支持文本和图片,下面增加支持文件的功能:

import time
import uiautomation as auto
from uiautomation.uiautomation import Bitmap
import win32clipboard
from ctypes import *

class DROPFILES(Structure):
fields = [
(“pFiles”, c_uint),
(“x”, c_long),
(“y”, c_long),
(“fNC”, c_int),
(“fWide”, c_bool),
]

pDropFiles = DROPFILES()
pDropFiles.pFiles = sizeof(DROPFILES)
pDropFiles.fWide = True
matedata = bytes(pDropFiles)

def setClipboardFiles(paths):
files = (“\0”.join(paths)).replace(“/”, “\”)
data = files.encode(“U16”)[2:]+b"\0\0"
win32clipboard.OpenClipboard()
try:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

1712537891428)]
[外链图片转存中…(img-uJIq78Vr-1712537891429)]
[外链图片转存中…(img-k6s4qWHG-1712537891429)]

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-1Y5WIlnQ-1712537891430)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值