我有一个小的 Python 3.3 脚本,可以成功发送 (SendMessage) 一条 WM_COPYDATA 消息(灵感来自这里,与XYplorer一起使用):
import win32api
import win32gui
import struct
import array
def sendScript(window, message):
CopyDataStruct = "IIP"
dwData = 0x00400001 #value required by XYplorer
buffer = array.array("u", message)
cds = struct.pack(CopyDataStruct, dwData, buffer.buffer_info()[1] * 2 + 1, buffer.buffer_info()[0])
win32api.SendMessage(window, 0x004A, 0, cds) #0x004A is the WM_COPYDATA id
message = "helloworld"
sendScript(window, message) #I write manually the hwnd during debug
现在我需要编写一个接收器脚本,仍然使用 Python。此答案中的脚本似乎有效(在更正表单print
中的所有语句之后print()
)。似乎是因为它打印出除hwnd
消息内容外的收到消息( 、、、wparam
等lparam
)的所有属性。相反,我收到一个错误UnicodeEncodeError。进一步来说,
Python WNDPROC handler failed
Traceback (most recent call last):
File "C:\Python\xxx.py", line 45, in OnCopyData
print(ctypes.wstring_at(pCDS.contents.lpData))
File "C:\Python\python-3.3.2\lib\encodings\cp850.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 10-13: character maps to <undefined>
我不知道如何解决它,也因为我没有在消息中使用“花哨”字符,所以我真的不明白为什么我会收到这个错误。我还尝试设置不同长度的消息print(ctypes.wstring_at(pCDS.contents.lpData))
以及使用 simple string_at
,但没有成功(在后一种情况下,我获得了一个二进制字符串)。