using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using Trigger.Events; namespace Trigger { partial class Main { #region Structs & Constants internal const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000; internal const int DEVICE_NOTIFY_SERVICE_HANDLE = 0x00000001; #endregion #region Events /// /// When a Win32 was received /// You may have to register this Form for receiving such messages first /// private static event EventPlugin.EventValue OnMessageReceived; /// /// When a Win32 was received /// You may have to register this Form for receiving such messages first /// public static event EventPlugin.EventValue MessageReceived { add { OnMessageReceived += value; } remove { OnMessageReceived -= value; } } #endregion #region Properties /// Takes care of thread safe access to this class private ReaderWriterLock _lock = new ReaderWriterLock(); /// Which messages shall be processed private Dictionary _messageSet = new Dictionary(); #endregion #region Methods /// /// Enable the specified for being processed and forwared /// /// public void RegisterEventForMessage(Classes.System.WindowsMessages messageID) { _lock.AcquireWriterLock(Timeout.Infinite); if (!_messageSet.ContainsKey((int)messageID)) _messageSet.Add((int)messageID, 1); else _messageSet[(int)messageID]++; _lock.ReleaseWriterLock(); } /// /// Disable the specified for being processed and forwared /// /// public void UnregisterEventForMessage(Classes.System.WindowsMessages messageID) { _lock.AcquireWriterLock(Timeout.Infinite); if (_messageSet.ContainsKey((int)messageID) && _messageSet[(int)messageID] > 1) _messageSet[(int)messageID]--; _lock.ReleaseWriterLock(); } /// /// The actual method that is being called when a is broadcasted /// /// protected override void WndProc(ref Message m) { _lock.AcquireWriterLock(Timeout.Infinite); bool handleEvent = _messageSet.ContainsKey(m.Msg) && _messageSet[m.Msg] > 0; _lock.ReleaseWriterLock(); if (handleEvent && OnMessageReceived != null) { Message mm = m; ThreadPool.QueueUserWorkItem(s => OnMessageReceived(null, new EventArgsValue(mm))); } base.WndProc(ref m); } #endregion } }