[python-win32] hook to obtain WM_GESTURE

John Grant cyrfer at gmail.com
Thu May 9 20:13:08 CEST 2013


Hi Tim,

Thanks for the great explanations.

Yes, you are right, I am trying to intercept gestures in a window within
the same process. The Blender application framework has a WndProc in C, and
Blender supports extending itself with user-supplied Python scripts. I am
trying to add gesture support with Python so I can avoid modifying the
Blender C code.

I'm reading through the wxPython article. It looks like a perfect fit for
my problem. It shows everything I need to do, and using ctypes! Thanks!

Although, I am stuck trying to get the HWND from Blender. It seems they
have not exposed the handle yet. I'm looking for win32 API that might
provide it to me, or a list of windows associated with the process.

I guess I have to remove my callback as soon as the WM_DESTROY message is
emitted, and reinstantiate the oldWndProc. That makes sense. I'm glad that
is shown in the article.

I just browsed the Blender C source code and they also use
"SetWindowLongPtr" for GWLP_USERDATA, but not for GWLP_WNDPROC. I think
everything will work out fine when I find the HWND.

Thanks for the expert help.
John


On Thu, May 9, 2013 at 9:46 AM, Tim Roberts <timr at probo.com> wrote:

> John Grant wrote:
> >
> > I would like to obtain multi-touch events in my Python code (running
> > inside Blender's python environment). I have looked around the web for
> > a python module that works with py 3.3 (others work with py 2.x), but
> > I have not found one. So, I'm trying to build one.
> >
> > I believe I can use the 'ctypes' to call the function I need,
> > GetGestureInfo.
>
> That gets you gestures, but not multitouch.  If all you need is the
> zoom, pan and rotate gestures and a two-finger tap, this will do it.
> For more complicated gestures, most solutions are custom right now.
>
>
> > This function requires 2 parameters as input, the lParam from WndProc
> > and a pointer to the GESTUREINFO structure.
> >
> > * I hope I can use 'ctypes' to declare the GESTUREINFO structure in my
> > python code.*
> > I see it is possible to pass structures as pointers using ctypes as well.
>
> The structure doesn't have any pointers, so this should be straightforward.
>
>
> > *** The problem seems to be obtaining the lParam from WndProc. ***
> >
> > My idea is to provide a callback function (again using ctypes to
> > declare this callback) and use the SetWindowsHookEx function, passing
> > my callback and the WH_CALLWNDPROC hook ID.
> >
> > Does this sound like it will work?
>
> No, a Windows hook is the wrong answer.  That lets you intercept
> messages from other processes (which is why hooks need to be in a DLL --
> the DLL actually gets copied and injected into the processes being
> hooked).  In your case, I assume you're trying to intercept gestures in
> a window within your own process.  Is that right?  As long as you have
> the window handle, all you need to do is subclass the window.  That
> means you make yourself the wndproc for that window, so you get first
> shot at all the messages.
>
> Here's an example that shows how to do this in wxPython, but you can
> eliminate the wxPython part of it.  The key point is using
> win32gui.SetWindowLong to load your own function in
> win32con.GWL_WNDPROC, and remembering the return value so you can call
> the original function.
>     http://wiki.wxpython.org/HookingTheWndProc
>
> --
> Tim Roberts, timr at probo.com
> Providenza & Boekelheide, Inc.
>
> _______________________________________________
> python-win32 mailing list
> python-win32 at python.org
> http://mail.python.org/mailman/listinfo/python-win32
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20130509/574b47ef/attachment.html>


More information about the python-win32 mailing list