-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.py
173 lines (138 loc) · 5.01 KB
/
util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import platform
import sys
# Data type
TYPE_OTHER = 'other'
TYPE_PNG = 'png'
TYPE_STRING = 'string'
# 'Windows' or 'macOS'
OS_WINDOWS = 1
OS_MAC = 2
OS_CUR = platform.system()
if OS_CUR == 'Darwin':
OS_CUR = OS_MAC
elif OS_CUR == 'Windows':
OS_CUR = OS_WINDOWS
else:
print('Your operating system is not supported.')
exit(1)
# 根据平台导入相应的库
if OS_CUR == OS_WINDOWS:
import win32clipboard as wcb
elif OS_CUR == OS_MAC:
from AppKit import NSPasteboard, NSPasteboardTypePNG, NSPasteboardTypeTIFF, NSPasteboardTypeString
import pasteboard
def getClipboardDataType():
"""获取剪贴板数据的类型。支持的类型为`png` `string` `other`。
Returns:
string -- 类型名称。
"""
if OS_CUR == OS_WINDOWS:
if wcb.IsClipboardFormatAvailable(wcb.CF_BITMAP):
return TYPE_PNG
elif wcb.IsClipboardFormatAvailable(wcb.CF_TEXT):
return TYPE_STRING
else:
return TYPE_OTHER
elif OS_CUR == OS_MAC:
pb = NSPasteboard.generalPasteboard()
data_type = pb.types()
if NSPasteboardTypePNG in data_type:
return TYPE_PNG
elif NSPasteboardTypeString in data_type:
return TYPE_STRING
else:
return TYPE_OTHER
# print(getClipboardDataType())
def getClipboardData(projDir="."):
"""获取剪贴板的内容。
Keyword Arguments:
projectDir {str} -- 项目路径。当剪贴板数据是图片时,会将图片保存到此路径中。 (default: {"."})
Returns:
string, string -- 第一返回值是剪贴板数据的类型。第二返回值是剪贴板的数据,若类型为图片则返回值为路径。
"""
t = getClipboardDataType()
if OS_CUR == OS_WINDOWS:
if t == TYPE_STRING:
wcb.OpenClipboard()
data = wcb.GetClipboardData(wcb.CF_TEXT)
wcb.CloseClipboard()
# print(data)
data = str(data, 'gbk')
data = data.replace('\r', '')
elif t == TYPE_PNG:
# import win32ui
# wcb.OpenClipboard()
# data = wcb.GetClipboardData(wcb.CF_BITMAP) # 这是个句柄,不知道怎么用
# wcb.CloseClipboard()
# dc = win32ui.CreateDCFromHandle(data)
# bmp = win32ui.CreateBitmapFromHandle(data)
# # print(dir(bmp))
# bmp.SaveBitmapFile(dc, '123.png')
from PIL import ImageGrab
img = ImageGrab.grabclipboard()
data = '%s/%s' % (projDir, 'data.png')
img.save(data, 'png')
else:
exit(2)
elif OS_CUR == OS_MAC:
if t == TYPE_STRING:
pb = NSPasteboard.generalPasteboard()
data = pb.dataForType_(NSPasteboardTypeString)
data = str(data, 'utf-8')
elif t == TYPE_PNG:
pb = NSPasteboard.generalPasteboard()
img = pb.dataForType_(NSPasteboardTypePNG)
data = '%s/%s' % (projDir, 'data.png')
img.writeToFile_atomically_(data, False) # 将剪切板数据保存为文件
else:
exit(2)
return t, data
# t, data = getClipboardData()
# print("t:", t)
# print("data:", data)
def setClipboardData(t, data):
"""向剪贴板写入数据。
Arguments:
t {string} -- 要写入数据的类型。
data {string} -- 要写入的数据。若类型为图片则此参数为图片的路径。
"""
if OS_CUR == OS_WINDOWS:
if t == TYPE_PNG:
import win32con
from PIL import Image
Image.open(data).save(data+'.bmp') # win的剪贴板仅支持bmp格式
from ctypes import windll
aString = windll.user32.LoadImageW(0, data+'.bmp', win32con.IMAGE_BITMAP, 0, 0, win32con.LR_LOADFROMFILE)
# print(aString)
if aString != 0: # 由于图片编码问题 图片载入失败的话 aString 就等于0
wcb.OpenClipboard()
wcb.EmptyClipboard()
wcb.SetClipboardData(win32con.CF_BITMAP, aString)
wcb.CloseClipboard()
elif t == TYPE_STRING:
wcb.OpenClipboard()
wcb.EmptyClipboard()
wcb.SetClipboardText(data)
wcb.CloseClipboard()
else:
exit(2)
elif OS_CUR == OS_MAC:
if t == TYPE_PNG:
f = open(data, 'rb')
img = f.read()
pb = pasteboard.Pasteboard()
pb.set_contents(img, pasteboard.PNG)
f.close()
elif t == TYPE_STRING:
pb = pasteboard.Pasteboard()
pb.set_contents(data)
else:
exit(2)
def testFunc():
setClipboardData(TYPE_STRING, '这是测试文本。')
t, data = getClipboardData()
print("type:", t)
print("data:", data)
# setClipboardData(TYPE_PNG, 'syncClipboard/data.png')
if __name__ == "__main__":
testFunc()