314 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Windows.Forms;
 | |
| using System.Collections;
 | |
| using System.Threading;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Summary description for MessageHandler.
 | |
| 	/// </summary>
 | |
| 	internal class MessageHandler
 | |
| 	{
 | |
| 		private static ArrayList m_Clients=new ArrayList();
 | |
| 		//private static bool m_FilterInstalled=false;
 | |
| 		//private static MessageFilterWrapper m_MessageFilter=null;
 | |
| 		private static Hashtable m_FilterOnThread=new Hashtable();
 | |
| 
 | |
|         private static ReaderWriterLock rwClientsListLock;
 | |
| 
 | |
|         // Methods
 | |
|         static MessageHandler()
 | |
|         {
 | |
|             MessageHandler.rwClientsListLock = new ReaderWriterLock();
 | |
|         }
 | |
| 
 | |
| 		public static void RegisterMessageClient(IMessageHandlerClient client)
 | |
| 		{
 | |
| 			if(m_Clients.Contains(client))
 | |
| 				return;
 | |
| 
 | |
| 			if(!m_FilterOnThread.ContainsKey(System.Threading.Thread.CurrentThread.GetHashCode()))
 | |
| 				InstallMessageFilter();
 | |
| 
 | |
|             LockCookie cookie1 = new LockCookie();
 | |
|             bool readerLockHeld = MessageHandler.rwClientsListLock.IsReaderLockHeld;
 | |
| 
 | |
|             if (readerLockHeld)
 | |
|             {
 | |
|                 cookie1 = MessageHandler.rwClientsListLock.UpgradeToWriterLock(-1);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 MessageHandler.rwClientsListLock.AcquireWriterLock(-1);
 | |
|             }
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 m_Clients.Add(client);
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (readerLockHeld)
 | |
|                 {
 | |
|                     MessageHandler.rwClientsListLock.DowngradeFromWriterLock(ref cookie1);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     MessageHandler.rwClientsListLock.ReleaseWriterLock();
 | |
|                 }
 | |
|             }
 | |
| 		}
 | |
| 
 | |
| 		public static void UnregisterMessageClient(IMessageHandlerClient client)
 | |
| 		{
 | |
|             if (m_Clients.Contains(client))
 | |
|             {
 | |
|                 LockCookie cookie1 = new LockCookie();
 | |
|                 bool readerLockHeld = MessageHandler.rwClientsListLock.IsReaderLockHeld;
 | |
| 
 | |
|                 if (readerLockHeld)
 | |
|                 {
 | |
|                     cookie1 = MessageHandler.rwClientsListLock.UpgradeToWriterLock(-1);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     MessageHandler.rwClientsListLock.AcquireWriterLock(-1);
 | |
|                 }
 | |
|                 bool unregister = false;
 | |
|                 try
 | |
|                 {
 | |
|                     m_Clients.Remove(client);
 | |
|                     unregister = m_Clients.Count == 0;
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     if (readerLockHeld)
 | |
|                     {
 | |
|                         MessageHandler.rwClientsListLock.DowngradeFromWriterLock(ref cookie1);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         MessageHandler.rwClientsListLock.ReleaseWriterLock();
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (BarUtilities.AutoRemoveMessageFilter && unregister && m_FilterOnThread.ContainsKey(System.Threading.Thread.CurrentThread.GetHashCode()))
 | |
|                     UninstallMessageFilter();
 | |
|             }
 | |
| 		}
 | |
| 
 | |
| 		private static void InstallMessageFilter()
 | |
| 		{
 | |
| 			if(m_FilterOnThread.ContainsKey(System.Threading.Thread.CurrentThread.GetHashCode()))
 | |
| 				return;
 | |
| 			MessageFilterWrapper messageFilter=new MessageFilterWrapper();
 | |
| 			Application.AddMessageFilter(messageFilter);
 | |
| 			m_FilterOnThread.Add(System.Threading.Thread.CurrentThread.GetHashCode(),messageFilter);
 | |
| 		}
 | |
| 
 | |
| 		private static void UninstallMessageFilter()
 | |
| 		{
 | |
| 			if(!m_FilterOnThread.ContainsKey(System.Threading.Thread.CurrentThread.GetHashCode()))
 | |
| 				return;
 | |
| 			MessageFilterWrapper messageFilter=m_FilterOnThread[System.Threading.Thread.CurrentThread.GetHashCode()] as MessageFilterWrapper;
 | |
| 			Application.RemoveMessageFilter(messageFilter);
 | |
| 			m_FilterOnThread.Remove(System.Threading.Thread.CurrentThread.GetHashCode());
 | |
| 		}
 | |
| 
 | |
| 		private static IMessageHandlerClient GetModalClient()
 | |
| 		{
 | |
|             MessageHandler.rwClientsListLock.AcquireReaderLock(-1);
 | |
|             try
 | |
|             {
 | |
|                 foreach (IMessageHandlerClient client in m_Clients)
 | |
|                 {
 | |
|                     if (client.IsModal)
 | |
|                     {
 | |
|                         return client;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 MessageHandler.rwClientsListLock.ReleaseReaderLock();
 | |
|             }
 | |
| 			return null;
 | |
| 		}
 | |
| 
 | |
|         private static IMessageHandlerClient[] GetMessageClients()
 | |
|         {
 | |
|             IMessageHandlerClient[] messageClients;
 | |
|             MessageHandler.rwClientsListLock.AcquireReaderLock(-1);
 | |
|             try
 | |
|             {
 | |
|                 messageClients = (IMessageHandlerClient[])m_Clients.ToArray(typeof(IMessageHandlerClient));
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 MessageHandler.rwClientsListLock.ReleaseReaderLock();
 | |
|             }
 | |
| 
 | |
|             return messageClients;
 | |
|         }
 | |
| 
 | |
| 		public static bool OnSysKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
| 		{
 | |
| 			IMessageHandlerClient modalClient=MessageHandler.GetModalClient();
 | |
| 			if(modalClient!=null)
 | |
| 			{
 | |
|                 if (!IsInvokeRequired(modalClient) && modalClient.OnSysKeyDown(hWnd, wParam, lParam))
 | |
| 					return true;
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
| 
 | |
| 			foreach(IMessageHandlerClient client in messageClients)
 | |
| 			{
 | |
|                 if (!IsInvokeRequired(client) && client.OnSysKeyDown(hWnd, wParam, lParam))
 | |
| 					return true;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public static bool OnSysKeyUp(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
| 		{
 | |
| 			IMessageHandlerClient modalClient=MessageHandler.GetModalClient();
 | |
| 			if(modalClient!=null)
 | |
| 			{
 | |
|                 if (!IsInvokeRequired(modalClient) && modalClient.OnSysKeyUp(hWnd, wParam, lParam))
 | |
| 					return true;
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
|             IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
| 			foreach(IMessageHandlerClient client in messageClients)
 | |
| 			{
 | |
|                 if (!IsInvokeRequired(client) && client.OnSysKeyUp(hWnd, wParam, lParam))
 | |
| 					return true;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public static bool OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
| 		{
 | |
|             IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
| 
 | |
| 			foreach(IMessageHandlerClient client in messageClients)
 | |
| 			{
 | |
|                 if (!IsInvokeRequired(client) && client.OnKeyDown(hWnd, wParam, lParam))
 | |
| 					return true;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public static bool OnMouseDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
| 		{
 | |
|             IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
| 			foreach(IMessageHandlerClient client in messageClients)
 | |
| 			{
 | |
| 				if(!IsInvokeRequired(client) && client.OnMouseDown(hWnd,wParam,lParam))
 | |
| 					return true;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
|         private static bool IsInvokeRequired(IMessageHandlerClient client)
 | |
|         {
 | |
|             DotNetBarManager manager = client as DotNetBarManager;
 | |
|             if (manager != null && manager.ParentForm != null && manager.ParentForm.InvokeRequired)
 | |
|                 return true;
 | |
|             else if (client is Control && ((Control)client).InvokeRequired)
 | |
|                 return true;
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
| 		public static bool OnMouseMove(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
| 		{
 | |
|             IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
| 			foreach(IMessageHandlerClient client in messageClients)
 | |
| 			{
 | |
|                 if(!IsInvokeRequired(client) && client.OnMouseMove(hWnd, wParam, lParam))
 | |
| 				    return true;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
|         public static bool OnMouseWheel(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
 | |
|         {
 | |
|             IMessageHandlerClient modalClient = MessageHandler.GetModalClient();
 | |
|             if (modalClient != null)
 | |
|             {
 | |
|                 if (!IsInvokeRequired(modalClient) && modalClient.OnMouseWheel(hWnd, wParam, lParam))
 | |
|                     return true;
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             IMessageHandlerClient[] messageClients = GetMessageClients();
 | |
|             foreach (IMessageHandlerClient client in messageClients)
 | |
|             {
 | |
|                 if (!IsInvokeRequired(client) && client.OnMouseWheel(hWnd, wParam, lParam))
 | |
|                     return true;
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
| 	}
 | |
| 
 | |
| 	internal class MessageFilterWrapper:IMessageFilter
 | |
| 	{
 | |
| 		public bool PreFilterMessage(ref System.Windows.Forms.Message m)
 | |
| 		{
 | |
| 			switch(m.Msg)
 | |
| 			{
 | |
| 				case NativeFunctions.WM_SYSKEYDOWN:
 | |
| 				{
 | |
| 					return MessageHandler.OnSysKeyDown(m.HWnd,m.WParam,m.LParam);
 | |
| 				}
 | |
| 				case NativeFunctions.WM_SYSKEYUP:
 | |
| 				{
 | |
| 					return MessageHandler.OnSysKeyUp(m.HWnd,m.WParam,m.LParam);
 | |
| 				}
 | |
| 				case (int)WinApi.WindowsMessages.WM_KEYDOWN:
 | |
| 				{
 | |
| 					return MessageHandler.OnKeyDown(m.HWnd,m.WParam,m.LParam);
 | |
| 				}
 | |
| 				case NativeFunctions.WM_LBUTTONDOWN:
 | |
| 				case NativeFunctions.WM_NCLBUTTONDOWN:
 | |
| 				case NativeFunctions.WM_RBUTTONDOWN:
 | |
| 				case NativeFunctions.WM_MBUTTONDOWN:
 | |
| 				case NativeFunctions.WM_NCMBUTTONDOWN:
 | |
| 				case NativeFunctions.WM_NCRBUTTONDOWN:
 | |
| 				{
 | |
| 					return MessageHandler.OnMouseDown(m.HWnd,m.WParam,m.LParam);
 | |
| 				}
 | |
| 				case NativeFunctions.WM_MOUSEMOVE:
 | |
| 				{
 | |
| 					return MessageHandler.OnMouseMove(m.HWnd,m.WParam,m.LParam);
 | |
| 				}
 | |
|                 case NativeFunctions.WM_MOUSEWHEEL:
 | |
|                 {
 | |
|                     return MessageHandler.OnMouseWheel(m.HWnd, m.WParam, m.LParam);
 | |
|                 }
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public void PostFilterMessage(ref System.Windows.Forms.Message m)
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	internal interface IMessageHandlerClient
 | |
| 	{
 | |
| 		bool OnSysKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
| 		bool OnSysKeyUp(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
| 		bool OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
| 		bool OnMouseDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
| 		bool OnMouseMove(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
|         bool OnMouseWheel(IntPtr hWnd, IntPtr wParam, IntPtr lParam);
 | |
| 		bool IsModal{get;}
 | |
| 	}
 | |
| }
 |