我正在使用pyhook来检测用户何时按下Control + C. 然后我使用win32clipboard api从剪贴板复制数据。
我面临的问题是代码返回的是上次复制的数据,而不是当前复制的数据。
是因为在剪贴板中保存某些东西需要时间吗?
这是我的代码:
from time import sleep
import win32clipboard
import win32api
import win32console
import win32gui
import pythoncom,pyHook
from threading import Thread
"""
win=win32console.GetConsoleWindow()
win32gui.ShowWindow(win,0)
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('testing 123')
"""
data=''
def getcopied():
global data
while True:
try:
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
break
except TypeError:
print "Copied Content Invalid"
break
if data.isalpha():
print data
def initkeystack():
global keystack
keystack=[ [i,-1] for i in ['','','','','']]
def ctrlc():
global keystack
ct=0
for i in range(5):
if ct==0:
if keystack[i]==['Lcontrol',0]:
ct=1
else:
if keystack[i]==['C',0]:
getcopied()
getcopied()
initkeystack()
def OnKeyboardEvent(event):
str=event.GetKey()
global keystack
if keystack[4]!=[str,0]:
del(keystack[0])
keystack.append([str,0])
ctrlc()
def OnKeyboardEventUp(event):
str=event.GetKey()
global keystack
if keystack[4]!=[str,1]:
del(keystack[0])
keystack.append([str,1])
ctrlc()
def klog():
keystack=[]
initkeystack()
while True:
try:
hm=pyHook.HookManager()
hm.KeyDown=OnKeyboardEvent
hm.KeyUp=OnKeyboardEventUp
hm.HookKeyboard()
while True:
pythoncom.PumpWaitingMessages()
except KeyboardInterrupt:
pass
a = Thread(target=klog)
a.start()
a.join()
答案 0 :(得分:0)
您可以使用ctypes来获取剪贴板。
这是一个简单的函数,如果剪贴板中有一个字符串,它将返回剪贴板。
import ctypes
user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
def getClipboard(user32, kernel32):
user32.OpenClipboard(0)
if user32.IsClipboardFormatAvailable(1):
data = user32.GetClipboardData(1)
data_locked = kernel32.GlobalLock(data)
clipText = ctypes.c_char_p(data_locked)
kernel32.GlobalUnlock(data_locked)
text = clipText.value
else:
text = ""
user32.CloseClipboard()
return text
print(getClipboard(user32, kernel32))