2014-10-07 31 views
0

编辑:本部分出来了,但看到第二篇文章下面的另一个问题。阅读二进制数据关闭Windows剪贴板,在搅拌机(python)

(这里一点背景故事,跳到了TLDR :))

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

TLDR

我需要帮助找到一种方法来写/从搅拌机剪贴板读取二进制数据/。我并不担心跨平台功能 - 游戏工具只有Windows。

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

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

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

pywin32 - 保留缺少DLL文件错误,所以我敢肯定我做错了什么。需要采取另一个刺,但我必须采取的步骤很相关(见TLDR部分上面的最后一句:))

TKinter - 没有读太多,因为它似乎只读纯文本。

ctypes - 实际上刚刚在写这篇文章的过程中发现了这个。看起来很可怕,但我会给它一个镜头。

回答

1

好吧,我终于得到了这个工作。以下是对此感兴趣的代码:

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() 
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”是存在的,因为无论出于何种原因,搅拌机没有看到平原-old“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