On Nov 19, 2007 9:41 PM, Shane Clark <[EMAIL PROTECTED]> wrote: > > On Nov 19, 2007 5:54 AM, Thomas Heller <[EMAIL PROTECTED]> wrote: > > Shane Clark schrieb: > > > Hi, > > > > > > I am trying to get my python app to output the name of the control > > > under the mouse each time it is clicked. Currently, I am trying to do > > > this with a combination of pyhook and pyAA, but pyAA gives me errors > > > for almost any control in Microsoft Office and some other apps that I > > > need to support. > > > > > > I have seen comtypes referenced several times while searching for > > > answers, but I am intermediate at best in Python and do not have great > > > knowledge of COM in general. Could anyone point me in the right > > > direction on how I might get this functionality using comtypes? > > > > I have no idea what the problems with pyhook or pyAA are, but I made a > > simple > > script for comtypes that works for me, with comtypes 0.4.0. When I have MS > > Word > > open, and the cursor is over the 'Save' button, the document is saved when > > I run the script. > > It may get you started. > > > > Thomas > > > > <code> > > from ctypes import oledll, windll, byref, POINTER > > from ctypes.wintypes import POINT > > from comtypes.client import wrap > > from comtypes.automation import VARIANT > > from comtypes import IUnknown > > > > oleacc = oledll.oleacc > > > > def AccessibleObjectFromPoint(x, y): > > pacc = POINTER(IUnknown)() > > var = VARIANT() > > oleacc.AccessibleObjectFromPoint(POINT(x, y), > > byref(pacc), > > byref(var)) > > return wrap(pacc), var.value > > > > def GetCursorPos(): > > pt = POINT() > > windll.user32.GetCursorPos(byref(pt)) > > return pt.x, pt.y > > > > if __name__ == "__main__": > > x, y = GetCursorPos() > > pacc, value = AccessibleObjectFromPoint(x, y) > > print pacc.accName() > > print pacc.accDefaultAction() > > print pacc.accDoDefaultAction() > > <code/> > > > > > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by: Microsoft > > Defy all challenges. Microsoft(R) Visual Studio 2005. > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > _______________________________________________ > > comtypes-users mailing list > > comtypes-users@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/comtypes-users > > > > I incorporated that snippet into a little test script and I still have > trouble with Office controls. If I run your example all is well, but > mine gives the following error: "WindowsError: [Error -2147417843] An > outgoing call cannot be made since the application is dispatching an > input-synchronous call" > > Presumably, this is a timing problem, as I found references to it in > other contexts. I have no idea how to resolve it at this point, but I > am exploring it. Has anyone else seen this error from comtypes? My > code is below. > > <code> > import pythoncom, pyHook > from ctypes import oledll, windll, byref, POINTER > from ctypes.wintypes import POINT > from comtypes.client import wrap > from comtypes.automation import VARIANT > from comtypes import IUnknown > > oleacc = oledll.oleacc > > def AccessibleObjectFromPoint(x, y): > pacc = POINTER(IUnknown)() > var = VARIANT() > oleacc.AccessibleObjectFromPoint(POINT(x, y), > byref(pacc), > byref(var)) > return wrap(pacc), var.value > > def GetCursorPos(): > pt = POINT() > windll.user32.GetCursorPos(byref(pt)) > return pt.x, pt.y > > def OnMouseClick(event): > x,y = GetCursorPos() > pacc, value = AccessibleObjectFromPoint(x, y) > print pacc.accName() > > # return True to pass the event to other handlers > return True > > if __name__ == "__main__": > # create a hook manager > hm = pyHook.HookManager() > # watch for left-click events > hm.MouseLeftDown = OnMouseClick > # set the hook > hm.HookMouse() > # wait forever > pythoncom.PumpMessages() > </code> > > Thanks, > -Shane Clark > I got it working. I was running into trouble with the fact that Windows will not let you call out from a handler like I was trying to do. I then ran into some threading issues when I tried to use a timer initially. Here is my working code if anyone is interested. Thank you for the help.
<code> import pythoncom, pyHook from threading import Timer from ctypes import oledll, windll, byref, POINTER from ctypes.wintypes import POINT from comtypes.client import wrap from comtypes.automation import VARIANT from comtypes import IUnknown oleacc = oledll.oleacc def AccessibleObjectFromPoint(x, y): pacc = POINTER(IUnknown)() var = VARIANT() oleacc.AccessibleObjectFromPoint(POINT(x, y), byref(pacc), byref(var)) return wrap(pacc), var.value def ShowButton(): pythoncom.CoInitialize() x,y, = GetCursorPos() pacc, value = AccessibleObjectFromPoint(x, y) print pacc.accName() def GetCursorPos(): pt = POINT() windll.user32.GetCursorPos(byref(pt)) return pt.x, pt.y def OnMouseClick(event): #pythoncom.CoInitialize() t = Timer(0.01, ShowButton) t.start() # return True to pass the event to other handlers return True if __name__ == "__main__": #pythoncom.CoInitialize() # create a hook manager hm = pyHook.HookManager() # watch for left-click events hm.MouseLeftDown = OnMouseClick # set the hook hm.HookMouse() # wait forever pythoncom.PumpMessages() </code> -Shane Clark ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ comtypes-users mailing list comtypes-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/comtypes-users