Я пытаюсь прочитать из 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 и вспомнил, что они не принимают символы Юникода из прошлого опыта, затем я переключился на ctypes.Несмотря на то, что для меня это был почти новый мир в Python, я попробовал с POINTER()
, и все, что я получил, было неизвестными объектами для меня или нарушениями доступа.
Я думаю, что код должен создать COPYDATASTRUCT
:
class CopyDataStruct(Structure):
_fields_ = [('dwData', c_int),
('cbData', c_int),
('lpData', c_void_p)]
Затем сделайте 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)
pCDS = ctypes.cast(lparam, PCOPYDATASTRUCT)
print ctypes.wstring_at(pCDS.contents.lpData)