Получение 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) 

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 2.x в Windows
  • Ключевое эхо в Python в отдельном потоке не отображает первый ход ключа
  • Зачем мне нужно __declspec (dllexport), чтобы сделать некоторые функции доступными из ctypes?
  • Давайте зашифруем сертификат, Python и Windows
  • Кросс-платформенное пространство, оставшееся на томе с использованием python
  • Python исполняемые файлы: py2exe или PyInstaller?
  • / bin / env: python: нет такого файла или каталога (Windows через Git Bash пытается установить новый код облака анализа)
  • Признание установки cx_Oracle в PyDev
  • No Module Named '_pywrap_tensorflow_internal' (все еще без рабочего решения)
  • Ошибка загрузки ImportError DLL без импорта _tkinter
  • Создание точки соединения NTFS в Python
  •  
    Interesting Posts for Van-Lav

    Лучший алгоритм для перетасовки (или чередования) нескольких списков различной длины

    Состояние смешанной многопроцессорности и потоковой обработки в Python

    Повторное диалоговое окно с Tkinter и Matplotlib в Mac OS X

    Как распознать гистограммы с определенной формой в opencv / python

    Python: ускорение географического сравнения

    Сгенерировать подпрограмму Fortran с помощью Sympy codegen для системы уравнений

    Как я могу индексировать этот массив numpy?

    Как высмеивать вызовы функции, которая получает измененный объект в качестве параметра?

    Найти значения списка не в данных dataframe pandas

    (Python 3) Как передать двоичный файл как текст без сохранения первого

    libpython2.7.a отсутствует множество ссылок

    Google App Engine – непомерно медленное и дорогостоящее резервное копирование и восстановление?

    Любое значение при перехвате исключения и немедленном его повторении?

    Как программно создавать логические блоки в Blender?

    Как передать параметр только одной части объекта конвейера в scikit learn?

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