Есть большое желание прикрутить HTMLayout к питону. Поиском нашел что вопрос пару раз поднимался, но насколько я понял никто так и не взялся.
Пытаюсь пока прикрутить обвязку к си интерфейсу (через ctypes), вроде бы почти завелось но какие-то кривые события в обработчик приходят.
Тестовый код выглядит примерно так:
def wndproc(hWnd, message, wParam, lParam):
(handled, res) = HTMLayoutProcND(hWnd, message, wParam, lParam)
if handled:
return res
if message == WM_CLOSE or message == WM_DESTROY:
win32gui.PostQuitMessage(0)
return win32gui.DefWindowProc(hWnd, message, wParam, lParam)
def event_callback(tag, elem, event, params):
if event == HANDLE_BEHAVIOR_EVENT:
id = HTMLayoutGetAttributeByName(elem, "id")
bp = cast(params, POINTER(BEHAVIOR_EVENT_PARAMS)).contents
print "%s %d: %s" % (id, bp.cmd, ByteToHex(buffer(bp)))
return False
...
hWnd = win32gui.CreateWindow("HTMLayoutDemo", ...
HTMLayoutProcND(hWnd, WM_CREATE, 0, 0) # Костыль для win32gui - WN_CREATE не приходит в wndproc
win32gui.ShowWindow(hWnd, SW_SHOWNORMAL)
HTMLayoutLoadHtml(hWnd, "<html><body>Hello world!!<p/><button id='btn'>Press me</button></body></html>")
HTMLayoutWindowAttachEventHandler(hWnd, event_callback, 0, HANDLE_ALL)
Окно появляется, но после нажатия на кнопку в консоль выводится
btn 32768: 00 80 00 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00
btn 65536: 00 00 01 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00
т. е. событий BUTTON_PRESS, BUTTON_CLICK не видно. Есть какие-нибудь идеи почему могут не приходить события?
Возможно конечно что с маршаллингом данных из си какие-то проблемы, но в си приложении при нажатии на кнопку приходят четыре события — 32769, 1, 32768, 0.
Может быть какие-то проблемы с win32gui, уже нарвался на то что WM_CREATE в wndproc он не пробрасывает. HTMLayout кроме WM_CREATE ожидает еще что-нибудь при создании окна?