在Windows剪贴板中读取二进制数据,在Blender(python)中

时间:2014-10-07 16:03:45

标签: python windows binary clipboard blender

编辑:想出这个部分,但请看下面第二篇文章的另一个问题。

(这里有点背景故事,请跳过TLDR :))

我目前正在尝试为Blender编写一些脚本来帮助改进我玩游戏的关卡创建工作流程(Natural Selection 2)。目前,要将几何从关卡编辑器移动到Blender,我必须1)将编辑器中的文件保存为.obj 2)将obj导入blender,然后进行更改。然后我使用我编写的导出器脚本导出到游戏的级别格式,并且4)在编辑器的新实例中重新打开该文件。 5)从新实例复制级别数据。 6)粘贴到主级文件中。这是一件非常痛苦的事情,并且非常明显地甚至不鼓励使用该工具,除了主要编辑。我想改进工作流程:1)在编辑器中将数据复制到剪贴板2)在Blender中运行导入器脚本以加载数据。 3)在blender中运行导出器脚本以保存数据。 4)粘贴回原始文件。这不仅在繁琐的过程中削减了两个完整的步骤,而且还消除了使我的桌面混乱的额外文件的需要。目前,我还没有找到一种方法从Windows剪贴板读入剪贴板数据到Blender ...至少不需要经过一些非常复杂的安装步骤(例如安装python 3.1,安装pywin32,移动x ,y,z到blender目录,卸载python 3.1 ......等......)

TLDR

我需要帮助找到一种在Blender中向/从剪贴板写入/读取BINARY数据的方法。我并不担心跨平台功能 - 游戏工具只适用于Windows。

理想情况下 - 虽然显然乞丐不能在这里选择 - 但解决方案不会让为外行人安装脚本太困难。我(希望)不是唯一一个将要使用它的人,所以我希望尽可能简化安装说明。如果python标准库中有解决方案,那就太棒了!

我已经/现在正在看的事情

Pyperclip - 仅限明文。我需要能够从剪贴板中读取BINARY数据。

pywin32 - 保持丢失DLL文件错误,所以我确定我做错了什么。需要再次尝试,但我必须采取的步骤非常复杂(参见TLDR部分上面的最后一句:))

TKinter - 没有太多地读到这篇文章,因为它似乎只是阅读纯文本。

ctypes - 实际上只是在写这篇文章的过程中发现了这一点。看起来很可怕,但我会试一试。

2 个答案:

答案 0 :(得分:2)

好的,我终于有了这个工作。以下是感兴趣的人的代码:

from ctypes import *
from binascii import hexlify

kernel32 = windll.kernel32
user32 = windll.user32

user32.OpenClipboard(0)

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

if user32.IsClipboardFormatAvailable(CF_SPARK):
    data = user32.GetClipboardData(CF_SPARK)
    size = kernel32.GlobalSize(data)
    data_locked = kernel32.GlobalLock(data)
    text = string_at(data_locked,size)
    kernel32.GlobalUnlock(data)
else:
    print('No spark data in clipboard!')
user32.CloseClipboard()

答案 1 :(得分:0)

Welp ......这对我来说是一个新纪录(发帖提问并几乎立即找到答案)。

对于那些感兴趣的人,我发现了这个:How do I read text from the (windows) clipboard from python?

这正是我追求的......有点儿。我使用该代码作为起点。

而不是CF_TEXT = 1

我使用了CF_SPARK = user32.RegisterClipboardFormatW("application/spark editor")

以下是我从http://msdn.microsoft.com/en-us/library/windows/desktop/ms649049(v=vs.85).aspx

获取该功能名称的地方

“W”是因为无论出于何种原因,Blender没有看到普通的“RegisterClipboardFormat”函数,你必须使用“... FormatW”或“... FormatA”。不知道为什么会这样。如果有人知道,我很乐意听到它! :)

无论如何,还没有让它实际工作:仍然需要找到一种方法将这个“数据”对象分解成字节,这样我才能真正使用它,但这不应该太难。

抓一点,这给我带来了很多困难。

这是我的代码

from ctypes import *
from binascii import hexlify

kernel32 = windll.kernel32
user32 = windll.user32

user32.OpenClipboard(0)

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

if user32.IsClipboardFormatAvailable(CF_SPARK):
    data = user32.GetClipboardData(CF_SPARK)
    data_locked = kernel32.GlobalLock(data)
    print(data_locked)
    text = c_char_p(data_locked)
    print(text)
    print(hexlify(text))
    kernel32.GlobalUnlock(data_locked)
else:
    print('No spark data in clipboard!')
user32.CloseClipboard()

没有任何错误,但输出错误。行print(hexlify(text))产生b'e0cb0c1100000000',当我应该得到946字节长的东西时,前4个应该是01 00 00 00.(这是剪贴板数据,从InsideClipboard保存为.bin文件:https://www.dropbox.com/s/bf8yhi1h5z5xvzv/testLevel.bin?dl=1