2014-10-07 18 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