Получение WM_COPYDATA в Python

Я пытаюсь читать с 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)] 

Затем сделайте 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) 

  • Ошибка загрузки ImportError DLL без импорта _tkinter
  • Python 2.7 на Windows, «assert main_name не в sys.modules, main_name» для всех примеров многопроцессорности
  • Обработка \ r \ n vs \ n новых строк в python на Mac и Windows
  • Невозможно открыть virtualenv на WIndows
  • Python: как выйти из CLI при блокировке raw_input?
  • Как установить PyCrypto в Windows?
  • Вопросы виртуального виртуального питона
  • Python: перейдите в каталог переносных устройств (Windows 7)
  • One Solution collect form web for “Получение WM_COPYDATA в Python”

    Я написал следующее тривиальное приложение win32gui:

     import win32con, win32api, win32gui, ctypes, ctypes.wintypes class COPYDATASTRUCT(ctypes.Structure): _fields_ = [ ('dwData', ctypes.wintypes.LPARAM), ('cbData', ctypes.wintypes.DWORD), ('lpData', ctypes.c_void_p) ] PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT) 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 ) print self.hwnd 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() 

    Затем я отправил в окно сообщение WM_COPYDATA из другого приложения (написанное в Delphi):

     Text := 'greetings!'; CopyData.cbData := (Length(Text)+1)*StringElementSize(Text); CopyData.lpData := PWideChar(Text); SendMessage(hwnd, WM_COPYDATA, Handle, NativeInt(@CopyData)); 

    Выход был:

     461584 461584 74 658190 2620592 42 22 greetings! 

    Похоже, что это работает тривиально, в значительной степени, как вы его закодировали.

    Единственное, что я могу придумать, это то, что текст в COPYDATASTRUCT Spotify не COPYDATASTRUCT нулем. Вы должны быть в состоянии проверить это довольно легко, читая данные. Используйте cbData .

    Python - лучший язык программирования в мире.