2

我有一个小的 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消息内容外的收到消息( 、、、wparamlparam)的所有属性。相反,我收到一个错误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,但没​​有成功(在后一种情况下,我获得了一个二进制字符串)。

4

1 回答 1

0

ctypes.wstring(在行中print (ctypes.wstring_at(pCDS.contents.lpData)))可能不是发件人发送的字符串类型。尝试将其更改为:

print (ctypes.string_at(pCDS.contents.lpData))
于 2020-03-23T21:42:29.357 回答