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); }); }
private static void OpenMultiClampConversation(uint lParam) { log.Debug("Opening MultiClamp conversation..."); int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_OPEN_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam); log.DebugFormat(" result = {0}", result); }
private static void RequestTelegraphValue(uint lParam) { log.Debug("Requesting telegraph data..."); int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_REQUEST_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam); log.DebugFormat(" result = {0}", result); }
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; } }
void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { //Handle manage object disposal // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } 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; } }
private void ReceiveWmCopyDataEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs) { // WM_COPYDATA LPARAM is a pointer to a COPYDATASTRUCT structure Win32Interop.COPYDATASTRUCT 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* try { if (cds.lpData == IntPtr.Zero || (cds.cbData != 128 /* 700A */ && cds.cbData != 256 /* 700B */) || (long)cds.dwData != MultiClampInterop.MCTG_REQUEST_MESSAGE) return; var mtd = (MultiClampInterop.MC_TELEGRAPH_DATA)Marshal.PtrToStructure(cds.lpData, typeof(MultiClampInterop.MC_TELEGRAPH_DATA)); if (mtd.uChannelID != Channel) return; // For some reason the hardware type can come through corrupted. The rest of the structure is intact however. if (mtd.uHardwareType != (uint)MultiClampInterop.HardwareType.MCTG_HW_TYPE_MC700A && mtd.uHardwareType != (uint)MultiClampInterop.HardwareType.MCTG_HW_TYPE_MC700B) { log.Debug("Unknown hardware type in received message. Using device hardware type instead."); mtd.uHardwareType = (uint)HardwareType; } if (mtd.uHardwareType != (uint)HardwareType) return; var md = new MultiClampInterop.MulticlampData(mtd); log.Debug("WM_COPYDATA message received from MCCommander"); OnParametersChanged(md); } catch (ArgumentOutOfRangeException) { log.ErrorFormat("WM_COPYDATA message received from MCCommander, but operating mode is not valid."); RequestTelegraphValue((uint) evtArgs.Message.LParam); } }
private void ReceiveReconnectEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs) { var lParam = DeviceLParam(); if (evtArgs.Message.LParam != (IntPtr) lParam) return; log.DebugFormat("Received MCTG_RECONNECT_MESSAGE: {0}", evtArgs.Message); UnregisterForWmCopyDataEvents(); UnregisterForReconnectEvents(); OpenMultiClampConversation(lParam); RegisterForWmCopyDataEvents(); RegisterForReconnectEvents(); RequestTelegraphValue((uint) lParam); }
private static void ReceiveIdEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs) { log.DebugFormat("Received MCTG_ID_MESSAGE: {0}", evtArgs.Message); // Not aware of a good way to determine if this is a 700A or 700B messsage. We'll assume 700B and let // the user do some bitwise operators on the serial number to get the COM port and device number if they // know the message is coming from a 700A Commander. uint serialNumber; uint channel; MultiClampInterop.MCTG_Unpack700BSignalIDs((uint)evtArgs.Message.LParam, out serialNumber, out channel); availableSerialNumbers.Add(serialNumber); }