首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SendMessage返回误差

SendMessage返回误差
EN

Stack Overflow用户
提问于 2013-12-17 16:50:41
回答 1查看 1.2K关注 0票数 0

我正在编写一个python脚本,以便与使用wm_copydata的程序进行交互,但在读取返回数据方面遇到了困难。我已经将几个例子转化为以下几个方面:

代码语言:javascript
复制
import win32con, win32api, win32gui
import ctypes, ctypes.wintypes

FindWindow = ctypes.windll.user32.FindWindowW
SendMessage = ctypes.windll.user32.SendMessageW

class COPYDATASTRUCT(ctypes.Structure):
    _fields_ = [
        ('dwData', ctypes.wintypes.LPARAM),
        ('cbData', ctypes.wintypes.DWORD),
        ('lpData', ctypes.c_char_p)
        #formally lpData is c_void_p, but we do it this way for convenience
]

PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT)

# hwnd = FindWindow(None, "ZhornSoftwareStickiesMain")
# cds = COPYDATASTRUCT()
# cds.dwData = 0
# str = b'api do register'
# cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(str))
# cds.lpData = ctypes.c_char_p(str)

class Listener:

    def __init__(self):
        message_map = {
            win32con.WM_COPYDATA: self.OnCopyData
        }
        wc = win32gui.WNDCLASS()
        wc.lpfnWndProc = message_map
        wc.lpszClassName = 'MyWindowClass'
        hinst = wc.hInstance = win32api.GetModuleHandle(None)
        classAtom = win32gui.RegisterClass(wc)
        self.hwnd = win32gui.CreateWindow (
            classAtom,
            "win32gui test",
            0,
            0, 
            0,
            win32con.CW_USEDEFAULT, 
            win32con.CW_USEDEFAULT,
            0, 
            0,
            hinst, 
            None
        )
        self.register()

    def register(self):
        hwnd = FindWindow(None, "ZhornSoftwareStickiesMain")
        cds = COPYDATASTRUCT()
        cds.dwData = 0
        str = b'api do register'
        cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(str))
        cds.lpData = ctypes.c_char_p(str)
        SendMessage(hwnd, win32con.WM_COPYDATA, self.hwnd, ctypes.byref(cds))

    def OnCopyData(self, hwnd, msg, wparam, lparam):
        print(hwnd)
        print(msg)
        print(wparam)
        print(lparam)
        pCDS = ctypes.cast(lparam, PCOPYDATASTRUCT)
        print(pCDS.contents.dwData)
        print(pCDS.contents.cbData)
        print(ctypes.wstring_at(pCDS.contents.lpData))
        return 1

l = Listener()
win32gui.PumpMessages()

这使我犯了以下错误:

代码语言:javascript
复制
2621936
74
65880
2223904
0
32
Python WNDPROC handler failed
Traceback (most recent call last):
  File "C:\Users\mastelj\workspace\stickies\stickies.py", line 67, in OnCopyData
    print(ctypes.wstring_at(pCDS.contents.lpData))
  File "C:\Python33\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u3030' in position 0: character maps to <undefined>

我尝试将字符串编码为"utf-8",但它给了我一个不可用的字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-17 17:54:21

我发现了我所犯的错误。将违规行更改为:

代码语言:javascript
复制
print(pCDS.contents.lpData.decode("ascii", "ignore"))

解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20640021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档