python wia and RegisterEvent
Mark Hammond
skippy.hammond at gmail.com
Thu Apr 15 21:16:44 EDT 2010
On 16/04/2010 7:15 AM, gelonida wrote:
> Hi,
>
> I'd like to register an event in order to be informed, whenever a
> Windows WIA device is connected or disconnected.
>
> In python I can use WIA devices, but I don't know how to register
> events
>
> I have existing C# code, which works and looks like.
>
> class MgrHandlerClass
> {
> public void devManager_OnEvent(string eventID, string
> deviceID, string itemID)
> { } // her emy handler code
>
> public void addhandler(DeviceManager manager)
> {
> Console.WriteLine("adding handler!");
> manager.OnEvent += new
> WIA._IDeviceManagerEvents_OnEventEventHandler(
> devManager_OnEvent);
> }
>
> static void Main(string[] args)
> {
>
> MgrHandlerClass mgrhndlr;
> mgrhndlr = new MgrClass();
> DeviceManager manager;
>
> manager = new DeviceManagerClass();
>
> manager.RegisterEvent(WIA.EventID.wiaEventDeviceConnected, "*");
>
> manager.RegisterEvent(WIA.EventID.wiaEventDeviceDisconnected, "*");
> mgrhndlr.addhandler(manager);
> // wait for callbacks or do other stuff
> }
>
>
> Now in python I'm stuck
>
> import win32com.client
> import wia_defs # created with makepy.py
> manager = win32com.client.Dispatch("WIA.DeviceManager")
> mgrhndlr = MgrClass()
> manager.RegisterEvent(EventID=constants.wiaEventDeviceConnected,DeviceID=u'*')
> manager.RegisterEvent(EventID=constants.wiaEventDeviceDisconnected,DeviceID=u'*')
> mgrhndlr.addhandler(manager)
>
>
> class MgrHandlerClass:
> def OnEvent(self, EventID=defaultNamedNotOptArg,
> DeviceID=defaultNamedNotOptArg, ItemID=defaultNamedNotOptArg):
> print "Called back with (%s) (%s) (%s)" %
> (EventID,DeviceID,ItemID)
>
> def addhandler(self,manager):
> # here I'm stuck :-(
> # the following line doesn't work as it seems, that manager
> does not have attr
> # onevent
>
> manager.OnEvent.append( WIA._IDeviceManagerEvents_OnEventEventHandler(self.OnEvent) )
The model used by pywin32 is more "low level" than that exposed by some
of the MS languages. You probably need something closer to:
class MgrHandlerClass:
def OnEvent(self, EventID=defaultNamedNotOptArg, ...):
print "Called back with ..."
manager = win32com.client.DispatchWithEvents("WIA.DeviceManager",
MgrHandlerClass)
manager.RegisterEvent(EventID=constants.wiaEventDeviceConnected,DeviceID=u'*')
manager.RegisterEvent(EventID=constants.wiaEventDeviceDisconnected,DeviceID=u'*')
And magically your OnEvent should be called when the event happens.
Googling for 'DispatchWithEvents' might find some good hits for more
information.
HTH,
Mark
More information about the Python-list
mailing list