public MultiClampCommander(uint serialNumber, uint channel, IClock clock) { SerialNumber = serialNumber; Channel = channel; Clock = clock; UInt32 lParam = MulticlampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32 int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MulticlampInterop.MCTG_OPEN_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam); Win32Interop.MessageEvents.WatchMessage(Win32Interop.WM_COPYDATA, (sender, evtArgs) => { // WM_COPYDATA LPARAM is a pointer to a COPYDATASTRUCT structure Win32Interop.COPYDATASTRUCT cds; cds = (Win32Interop.COPYDATASTRUCT) Marshal.PtrToStructure(evtArgs.Message.LParam, typeof(Win32Interop.COPYDATASTRUCT)); // WM_COPYDATA structure (COPYDATASTRUCT) // dwData -- RegisterWindowMessage(MCTG_REQUEST_MESSAGE_STR) // cbData -- size (in bytes) of the MC_TELEGRAPH_DATA structure being sent // lpData -- MC_TELEGRAPH_DATA* MulticlampInterop.MC_TELEGRAPH_DATA mtd; mtd = (MulticlampInterop.MC_TELEGRAPH_DATA)Marshal.PtrToStructure(cds.lpData, typeof(MulticlampInterop.MC_TELEGRAPH_DATA)); var md = new MulticlampInterop.MulticlampData(mtd); OnParametersChanged(md); }); }
void Dispose(bool disposing) { if (!this._disposed) { UInt32 lParam = MulticlampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32 int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MulticlampInterop.MCTG_CLOSE_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam); // Note disposing has been done. _disposed = true; } }