Python 使用ctypes写入剪贴板失败。。。除非我有一些随机打印的语句?

Python 使用ctypes写入剪贴板失败。。。除非我有一些随机打印的语句?,python,binary,clipboard,Python,Binary,Clipboard,这个让我很困惑。我正在尝试使用ctypes库从Blender中将二进制数据写入windows剪贴板。而且它有效!嗯。。。某种程度上。出于某种原因,代码以某种方式失败,除非我有一些随机打印语句分散在某些语句之间。print语句本身并没有修改任何代码,它们只是打印出变量的内容或错误代码。注释掉这些行会使程序无法运行。如果我注释掉1,我会得到一个错误:访问冲突写入0x000000000000000000000000000000000000000000000000。。。这绝对不是它应该使用的地址。使用G

这个让我很困惑。我正在尝试使用ctypes库从Blender中将二进制数据写入windows剪贴板。而且它有效!嗯。。。某种程度上。出于某种原因,代码以某种方式失败,除非我有一些随机打印语句分散在某些语句之间。print语句本身并没有修改任何代码,它们只是打印出变量的内容或错误代码。注释掉这些行会使程序无法运行。如果我注释掉1,我会得到一个错误:访问冲突写入0x000000000000000000000000000000000000000000000000。。。这绝对不是它应该使用的地址。使用GetLastError告诉我8,根据这个:表示内存不足。那绝对不是真的。。。但我不知道是什么让它这么想。出于某种原因,在它上面调用hexlify函数会神奇地使它工作!至少这项声明。对kernel32或user32的每次调用似乎都需要用print语句分隔开。。。或是赫克斯利夫。。。不管怎样,我不知道

无论如何,代码如下,这些神秘的打印语句用hashtags标记。请注意,第一个函数以前被print语句包围,但我发现如果我只调用函数而不打印它产生的结果,它仍然可以工作。对于剩下的4条语句,我试着只注释打印行,将上面的错误赋值保持不变-停止工作。有关检索变量的内容神奇地修复了它。。。也许不是。。。我对此一无所知。但有一件事我确实试过了,这让我更加困惑,那就是我以前试过在空闲状态下运行它,它都在搅拌机中,并且它按照预期工作,不管打印与否。只有在Blender中,行为才会变得奇怪。我还尝试用sleep0.05替换打印语句,但没有效果

from ctypes import *
from binascii import *
from struct import *

memcpy = cdll.msvcrt.memcpy
kernel32 = windll.kernel32
user32 = windll.user32

user32.OpenClipboard(None)
user32.EmptyClipboard()

CF_SPARK = user32.RegisterClipboardFormatW("application/spark editor")
GPTR = 0x0040

sampleString = b''
sampleString +=pack('L', 1)
sampleString +=pack('L', 268)
sampleString += b'sheetsmellssheetsmellsbythesheetstore'

#hexlify(sampleString) ########### 1

length = len(sampleString)
memory_handle = kernel32.GlobalAlloc(GPTR,length)
error = kernel32.GetLastError()
print("error= ",error) ########## 2
data_point = kernel32.GlobalLock(memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 3

for i in range(0,length): 
    value = int.from_bytes((sampleString[i:i+1]), byteorder='little')
    memset(data_point+i,value,1)

kernel32.GlobalUnlock(memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 4
user32.SetClipboardData(CF_SPARK,memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 5
user32.CloseClipboard()
顺便说一句,如果有人知道比使用memset更好的写入剪贴板的方法,那就太棒了!请注意,我不能使用Strucy或StncPy,因为我试图移动的数据在数据中间有空缺。对于以null结尾的字符串,这显然是一件坏事

编辑:仍然在寻找这个问题的答案。我发现我可以用

hexlify(b'hello')

…而且效果也很好。再次注意,没有任何转让或声明。声明不应该对程序有任何影响。。。然而它是。。。不知怎的…

win32clipboard模块,但我不使用Blender。是的,它很有趣。。。那个代码在空闲时对我来说是完美的,但如果我把它放到Blender中,我必须在那里有多余的行,否则它就有错误了。