我试图从Python中读取WM_COPYDATA
消息,一些应用程序(我正在尝试使用Spotify)发送到WindowsLiveMessenger来更新"我正在听什么......"的短语.
根据我能够找到的WM_COPYDATA
消息,消息来自COPYDATASTRUCT
以下结构:
dwData
在我们的情况下0x547,以便它访问立即监听功能 cbData
收到的字符串长度 lpData
使用指向字符串本身的指针,可能包含Unicode字符该字符串应具有以下格式:\0Music\0status\0format\0song\0artist\0album\0
如ListeningNowTracker所述
我们在一个WM_COPYDATA
事件中收到的是一个lParam
包含指针的指针COPYDATASTRUCT
.
我开始修改pywin32函数,我记得他们不接受过去经验中的Unicode字符,然后我切换到ctypes.尽管对我来说这是一个几乎全新的Python世界,但我尝试过POINTER()
并且我得到的所有内容都是针对我的未知对象或访问违规行为.
我认为代码应该创建一个COPYDATASTRUCT
:
class CopyDataStruct(Structure):
_fields_ = [('dwData', c_int),
('cbData', c_int),
('lpData', c_void_p)]
Run Code Online (Sandbox Code Playgroud)
然后使它lParam
成为指向该结构的指针,从中获取字符串指针lpData
,最后得到字符串ctypes.string_at(lpData,cbData)
.
有小费吗?
更新1
该WM_COPYDATA
事件由win32gui
为此目的而构建的隐藏窗口接收.copydata事件连接到一个被调用的函数OnCopyData
,这是它的标题:
def OnCopyData(self, hwnd, msg, wparam, lparam):
与Spy ++消息日志中的值相比,函数提供的值是正确的.
更新2
这应该接近我想要的,但给出一个NULL指针错误.
class CopyDataStruct(ctypes.Structure):
_fields_ = [('dwData', c_int),
('cbData', c_int),
('lpData', c_wchar_p)]
PCOPYDATASTRUCT = ctypes.POINTER(CopyDataStruct) …
Run Code Online (Sandbox Code Playgroud)