protected override void WndProc(ref Message m)
        {
            if (m.Msg == (int)NativeMethods.Msgs.WM_COPYDATA)
            {
                // message was sended by ProcessViewer.Hooks.dll from the Hooked application when
                // a new message comes to that window

                // LPARAM of this message contains a COPYDATASTRUCT which has HOOK_MSG struct in it
                NativeMethods.COPYDATASTRUCT cdata =
                    (NativeMethods.COPYDATASTRUCT)m.GetLParam(typeof(NativeMethods.COPYDATASTRUCT));
                // This is the information of the message which is sended to the hooked window
                NativeMethods.HOOK_MSG msg = (NativeMethods.HOOK_MSG)Marshal.PtrToStructure(cdata.lpData,
                                                                                            typeof(NativeMethods.HOOK_MSG));

                // process message and set its result (0 ignore, 1 do nothing, other values replace parameters)
                m.Result = _subClass.ProcessMessage(m.WParam, ref msg);
                Marshal.DestroyStructure(m.LParam, typeof(NativeMethods.COPYDATASTRUCT));
            }
            else if (m.Msg == HM_MESSAGE_RESULT)
            //&& Properties.Settings.Default.HandleMessageResults)
            {
                // this message sended by hooked window to give information about the result of a message
                _subClass.ProcessMessageResult(m.WParam.ToInt32(), m.LParam);
            }
            else
            {
                base.WndProc(ref m);
            }
        }
        /// <summary>
        ///  Process message which belongs to the hooked window
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="hookedMessage"></param>
        /// <returns>
        ///		This return value will be sended to the Hooked window by our Listener Control
        ///
        ///		Return value might be;
        ///		0 : which means ignore this message (Hooked window will ignore this message)
        ///		1 : Do nothing (Hooked window will do its original action for this message)
        ///		<Other Values> : We are going to change the wParam and lParam for this message
        ///		here the return value indicates an adress in the target process memory which contains
        ///		the new values of the wParam and lParam
        ///		By passing this address to the Hooked window, we make it read the new values
        ///		from this address and replace original wParam and lParam with the new values
        ///		and process message according to this new parameters
        /// </returns>
        internal IntPtr ProcessMessage(IntPtr hWnd, ref NativeMethods.HOOK_MSG hookedMessage)
        {
            lock (this)
            {
                IntPtr             result = IntPtr.Zero;
                NativeMethods.Msgs msg    = (NativeMethods.Msgs)hookedMessage.msg;
                switch (msg)
                {
                case NativeMethods.Msgs.WM_MOVE:
                    _wm.OnMove();
                    break;

                case NativeMethods.Msgs.WM_SIZE:
                    _wm.OnResize();
                    break;
                }
                //if (Enabled && Breakpoints.ContainsKey(msg))
                //{
                //    // if Breakpoints enabled and if we have a breakpoint for the
                //    // given message then do our action
                //    MessageBreakpoint watch = Breakpoints[msg];
                //    switch (watch.Action)
                //    {
                //        case BreakpointAction.IgnoreMessage:
                //            result = new IntPtr(1);
                //            break;
                //        case BreakpointAction.ManuelEditParameters:
                //            FormEditMessage em = new FormEditMessage(hWnd, msg, hookedMessage.wParam, hookedMessage.lParam);
                //            em.ShowDialog(FormMain.Instance);
                //            if (!em.Ignore)
                //                result = WriteToTargetProcessMemory(em.WParam, em.LParam, em.ModifiedMsg);
                //            else
                //                result = new IntPtr(1);
                //            break;
                //        case BreakpointAction.AutoChangeParameters:
                //            NativeMethods.Msgs modifiedMsg = (NativeMethods.Msgs)hookedMessage.msg;
                //            IntPtr wParam = hookedMessage.wParam;
                //            IntPtr lParam = hookedMessage.lParam;

                //            if ((watch.Modifications & ModifiyingSections.Message) == ModifiyingSections.Message
                //                && watch.ModifiedMsg != NativeMethods.Msgs.WM_NULL)
                //                modifiedMsg = watch.ModifiedMsg;

                //            if ((watch.Modifications & ModifiyingSections.WParam) == ModifiyingSections.WParam)
                //                wParam = new IntPtr(watch.WParam.Value);

                //            if ((watch.Modifications & ModifiyingSections.LParam) == ModifiyingSections.LParam)
                //                lParam = new IntPtr(watch.LParam.Value);


                //            result = WriteToTargetProcessMemory(wParam, lParam, modifiedMsg);
                //            break;
                //    }
                //}

                if (ShowMessages)
                {
                    //StringBuilder text = new StringBuilder();
                    //text.AppendFormat("0x{0:X8}", hWnd.ToInt32());
                    //text.Append("  ");
                    //if (msgValues.ContainsKey(msg))
                    //    text.Append(msgValues[msg]);
                    //else
                    //    text.Append(msg);

                    //text.Append("  ");
                    //text.AppendFormat("wParam:{0}", hookedMessage.wParam);
                    //text.AppendFormat(" lParam:{0}", hookedMessage.lParam);
                    //if (result == (IntPtr)1)
                    //    text.Append(Properties.Resources.Hook_Ignored);
                    //text.AppendLine();

                    //FormMain.Instance.txtMessages.AppendText(text.ToString());
                }

                return(result);
            }
        }