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
}
}