Пример #1
0
        protected override void WndProc(ref Message msg)
        {
            base.WndProc(ref msg);
            if (msg.Msg != Native.WM_COPYDATA)
            {
                return;
            }

            using (var dataGram = WinMsgDataGram.FromPointer(msg.LParam, serializer))
            {
                if (MessageReceived != null && dataGram != null && dataGram.IsValid)
                {
                    MessageReceived.Invoke(this, new XDMessageEventArgs(dataGram));
                }
            }
        }
Пример #2
0
 /// <summary>
 ///     The native window message filter used to catch our custom WM_COPYDATA
 ///     messages containing cross AppDomain messages. All other messages are ignored.
 /// </summary>
 /// <param name = "msg">A representation of the native Windows Message.</param>
 protected override void WndProc(ref Message msg)
 {
     base.WndProc(ref msg);
     if (msg.Msg != Native.WM_COPYDATA)
     {
         return;
     }
     // we can free any unmanaged resources immediately in the dispose, managed channel and message
     // data will still be retained in the object passed to the event
     using (var dataGram = WinMsgDataGram.FromPointer(msg.LParam, serializer))
     {
         if (MessageReceived != null && dataGram.IsValid)
         {
             MessageReceived.Invoke(this, new XDMessageEventArgs(dataGram));
         }
     }
 }
        private void SendToChannel(string channelName, string dataType, string message)
        {
            channelName.Requires().IsNotNullOrWhiteSpace();
            message.Requires().IsNotNullOrWhiteSpace();

            using (var dataGram = new WinMsgDataGram(serializer, channelName, dataType, message))
            {
                var dataStruct = dataGram.ToStruct();
                var filter     = new WindowEnumFilter(XDWinMsgListener.GetChannelKey(channelName));
                var winEnum    = new WindowsEnum(filter.WindowFilterHandler);
                foreach (var hWnd in winEnum.Enumerate())
                {
                    IntPtr outPtr;
                    Native.SendMessageTimeout(hWnd, Native.WM_COPYDATA, IntPtr.Zero, ref dataStruct,
                                              Native.SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, out outPtr);
                }
            }
        }
        private void SendToChannel(string channelName, string dataType, string message)
        {
            channelName.Requires().IsNotNullOrWhiteSpace();
            message.Requires().IsNotNullOrWhiteSpace();

            using (var dataGram = new WinMsgDataGram(serializer, channelName, dataType, message))
            {
                var dataStruct = dataGram.ToStruct();
                var filter = new WindowEnumFilter(XDWinMsgListener.GetChannelKey(channelName));
                var winEnum = new WindowsEnum(filter.WindowFilterHandler);
                foreach (var hWnd in winEnum.Enumerate())
                {
                    IntPtr outPtr;
                    Native.SendMessageTimeout(hWnd, Native.WM_COPYDATA, IntPtr.Zero, ref dataStruct,
                        Native.SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, out outPtr);
                }
            }
        }
        private void SendToChannel(string channelName, string dataType, string message)
        {
            Validate.That(channelName).IsNotNullOrEmpty();
            Validate.That(message).IsNotNullOrEmpty();

            // create a DataGram instance, and ensure memory is freed
            using (var dataGram = new WinMsgDataGram(serializer, channelName, dataType, message))
            {
                // Allocate the DataGram to a memory address contained in COPYDATASTRUCT
                Native.COPYDATASTRUCT dataStruct = dataGram.ToStruct();
                // Use a filter with the EnumWindows class to get a list of windows containing
                // a property name that matches the destination channel. These are the listening
                // applications.
                var filter  = new WindowEnumFilter(XDWinMsgListener.GetChannelKey(channelName));
                var winEnum = new WindowsEnum(filter.WindowFilterHandler);
                foreach (var hWnd in winEnum.Enumerate())
                {
                    IntPtr outPtr;
                    // For each listening window, send the message data. Return if hang or unresponsive within 1 sec.
                    Native.SendMessageTimeout(hWnd, Native.WM_COPYDATA, IntPtr.Zero, ref dataStruct,
                                              Native.SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, out outPtr);
                }
            }
        }
        private void SendToChannel(string channelName, string dataType, string message)
        {
            Validate.That(channelName).IsNotNullOrEmpty();
            Validate.That(message).IsNotNullOrEmpty();

            // create a DataGram instance, and ensure memory is freed
            using (var dataGram = new WinMsgDataGram(serializer, channelName, dataType, message))
            {
                // Allocate the DataGram to a memory address contained in COPYDATASTRUCT
                Native.COPYDATASTRUCT dataStruct = dataGram.ToStruct();
                // Use a filter with the EnumWindows class to get a list of windows containing
                // a property name that matches the destination channel. These are the listening
                // applications.
                var filter = new WindowEnumFilter(XDWinMsgListener.GetChannelKey(channelName));
                var winEnum = new WindowsEnum(filter.WindowFilterHandler);
                foreach (var hWnd in winEnum.Enumerate())
                {
                    IntPtr outPtr;
                    // For each listening window, send the message data. Return if hang or unresponsive within 1 sec.
                    Native.SendMessageTimeout(hWnd, Native.WM_COPYDATA, IntPtr.Zero, ref dataStruct,
                                              Native.SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, out outPtr);
                }
            }
        }