0
|
1 ???using System; |
|
2 using System.Runtime.InteropServices; |
|
3 using System.Runtime.CompilerServices; |
|
4 using VirtualBox; |
|
5 |
|
6 namespace ConsoleApplication1 { |
|
7 public class VBoxEventArgs : EventArgs { |
|
8 public IEvent Event { get; private set; } |
|
9 public VBoxEventArgs(IEvent e) { |
|
10 Event = e; |
|
11 } |
|
12 } |
|
13 |
|
14 [ClassInterface(ClassInterfaceType.None)] |
|
15 [TypeLibType(TypeLibTypeFlags.FCanCreate)] |
|
16 [ComVisible(true)] |
|
17 public class VBoxEventListener : IEventListener { |
|
18 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] |
|
19 [Guid("9b6e1aee-35f3-4f4d-b5bb-ed0ecefd8538")] |
|
20 [ComImport()] |
|
21 interface IEventSourceXPCOM { |
|
22 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
23 [return: MarshalAs(UnmanagedType.Interface)] |
|
24 IEventListener CreateListener(); |
|
25 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
26 [return: MarshalAs(UnmanagedType.Interface)] |
|
27 IEventSource CreateAggregator([MarshalAs(UnmanagedType.SafeArray)] ref System.Array psubordinates); |
|
28 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
29 void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, IntPtr pinteresting, Int32 pactive); |
|
30 //void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] VBoxEventType[] pinteresting, Int32 pactive); |
|
31 |
|
32 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
33 void UnregisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener); |
|
34 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
35 Int32 FireEvent([MarshalAs(UnmanagedType.Interface)] IEvent pevent, Int32 ptimeout); |
|
36 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
37 [return: MarshalAs(UnmanagedType.Interface)] |
|
38 IEvent GetEvent([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, Int32 ptimeout); |
|
39 [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] |
|
40 void EventProcessed([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, [MarshalAs(UnmanagedType.Interface)] IEvent pevent); |
|
41 } |
|
42 |
|
43 public EventHandler<VBoxEventArgs> HandleEvent; |
|
44 void IEventListener.HandleEvent(IEvent aEvent) { |
|
45 Console.WriteLine("Event: {0}", aEvent.Type); |
|
46 if (HandleEvent != null) HandleEvent(this, new VBoxEventArgs(aEvent)); |
|
47 } |
|
48 |
|
49 public void RegisterSource(IEventSource src, params VBoxEventType[] events) { |
|
50 if (Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.WinCE) { |
|
51 Array eventTypesArray = (Array)events; |
|
52 src.RegisterListener(this, ref eventTypesArray, 1); |
|
53 } else { |
|
54 unsafe { |
|
55 fixed (VBoxEventType* ptr = events) { |
|
56 ((IEventSourceXPCOM)src).RegisterListener(this, (uint)events.Length, (IntPtr)ptr, 1); |
|
57 } |
|
58 } |
|
59 } |
|
60 } |
|
61 |
|
62 public void UnregisterSource(IEventSource src) { |
|
63 src.UnregisterListener(this); |
|
64 } |
|
65 } |
|
66 } |