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

2024-06-24 11:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这个让我很困惑。我正在尝试使用ctypes库从Blender中将二进制数据写入windows剪贴板。而且有效!呃。。。某种程度上。出于某种原因,代码以某种方式失败,除非在某些语句之间散布一些随机的“print”语句。print语句本身并没有修改任何代码,它们只是打印出变量的内容或错误代码。注释掉这些行会使程序无法运行。如果我注释掉#1,我会得到一个错误:“访问冲突写入0x000000000000000000000000000000”。。。这绝对不是它应该使用的地址。使用GetLastError()告诉我8,根据这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx表示“内存不足”。那绝对不是真的。。。但我不知道是什么让它这么想。出于某种原因,在它上面调用hexlify函数会神奇地使它工作!至少。。。那句话。对kernel32或user32的每次调用似乎都需要用print语句分隔开来。。。或是邪恶。。。不管怎样,我不知道!你知道吗

总之,代码如下,这些神秘的打印语句用hashtags标记。注意,第一个以前被print语句包围,但是我发现如果我只调用函数而不打印出它的结果,它仍然可以工作。在剩下的4条语句中,我试着只注释打印行,将上面的“error”赋值保持不变--停止工作。一些关于检索变量的东西神奇地修复了它。。。或许不是。。。我对此一无所知。但有一件事我确实试过了,这让我更加困惑,那就是我试过在空闲状态下运行它(以前,它都在搅拌机中),而且它像预期的那样工作,不管打印与否。只有在Blender中,这种行为才会变得奇怪。我也尝试过用“sleep(0.05)”替换print语句,但没有效果。你知道吗

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更好的方法来写入剪贴板,那就太棒了!请注意,我不能使用strcpy或strncpy,因为我试图移动的数据中间有空值。。。对于以空结尾的字符串来说,这显然是件坏事。你知道吗

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

hexlify(b'hello')

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


Tags: 代码fromimporterror语句ctypeslengthhandle