Take the 2-minute tour ×

I have a little Python 3.3 script that successfully sends (SendMessage) a WM_COPYDATA message (inspired from here , works with 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

Now I need to write a receiver script, still in Python. The script in this answer seems to work (after correcting all the print statements in a print() form). Seems because it prints out all properties of the received message (hwnd, wparam, lparam, etc) except the content of the message. I get an error instead, UnicodeEncodeError. More specifically,

Python WNDPROC handler failed
Traceback (most recent call last):
  File "C:\Python\xxx.py", line 45, in OnCopyData
  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>

I don't know how to fix it, also because I'm not using "fancy" characters in the message so I really can't see why I get this error. I also tried setting a different length of message in print(ctypes.wstring_at(pCDS.contents.lpData)) as well as using simply string_at, but without success (in the latter case I obtain a binary string).

share|improve this question

Your Answer



Browse other questions tagged or ask your own question.