Точная реакция на события планшета / мыши в Windows
Как я могу сказать Windows, чтобы он не делал бесполезную предварительную обработку событий планшета?
Я программирую на Python 2.6, ориентируясь на планшетные ПК под управлением Windows 7 (хотя я хотел бы, чтобы моя программа работала с небольшими изменениями на XP с интерактивной доской SMART и для пользователей мыши на Linux/Mac). Я написал программу, которая подключается к обычным событиям мыши в Windows, WM_MOUSEMOVE и т. Д. И пишет на холсте.
Проблема в том, что с сообщениями мыши манипулируют до того, как они достигают моего приложения. Я обнаружил, что если я делаю длинные удары и делаю паузу между ударами, то сообщения мыши отправляются правильно. Но если я делаю несколько быстрых коротких ударов, то что-то делает бесполезную предварительную обработку. В частности, если я делаю обводку длиной около 10 пикселей, а затем совершаю еще одно понижение примерно на пять пикселей вправо от первого, то второй WM_MOUSEDOWN сообщает, что он идет точно из того же места, что и первый.
Это похоже на некоторую предварительную обработку, возможно, чтобы наивные приложения не запутались в двойном щелчке. Но для моего приложения, где я хочу очень точный ответ на быстрые жесты, это бесполезно.
Я нашел ссылку на атом MicrosoftTabletPenServiceProperty и стиль окна CS_DBLCLKS, и я отключил их оба с помощью следующего фрагмента кода Python:
hwnd = self.GetHandle()
tablet_atom = "MicrosoftTabletPenServiceProperty"
atom_ID = windll.kernel32.GlobalAddAtomA(tablet_atom)
windll.user32.SetPropA(hwnd,tablet_atom,1)
currentstyle = windll.user32.GetClassLongA(hwnd, win32con.GCL_STYLE)
windll.user32.SetClassLongA(hwnd, win32con.GCL_STYLE, currentstyle & ~win32con.CS_DBLCLKS)
Но это не имеет никакого эффекта.
Я пытался написать низкоуровневый хук для драйвера мыши с помощью SetWindowsHookEx, но он не работает - очевидно, сообщения мыши предварительно обрабатываются даже до того, как они отправляются на мой низкоуровневый хук Windows.
Буду очень признателен за совет, как отключить эту предварительную обработку. Я не хочу переключаться на RealTimeStylus - во-первых, потому что он не будет работать на Windows XP плюс интерактивная доска SMART, во-вторых, потому что я не понимаю, как использовать RealTimeStylus в CPython, поэтому мне нужно переключиться на IronPython, а затем мой код больше не будет работать на Linux/Mac.
Дэймон.
1 ответ
Для необработанных сообщений мыши вы можете использовать WM_INPUT
на XP и позже. Семерка добавила сенсорный материал: WM_GESTURE
а также WM_TOUCH