protected virtual void InitializeWindowProcedure()
        {
            if (NewWindowProcedure != null)
            {
                return;
            }

            HandledWindow         = new HandleRef(null, User32.GetForegroundWindow());
            NewWindowProcedure    = WindowProcedure;
            NewWindowProcedurePtr = Marshal.GetFunctionPointerForDelegate(NewWindowProcedure);
            OldWindowProcedurePtr = User32.SetWindowLongPtr(HandledWindow, -4, NewWindowProcedurePtr);
        }
        protected virtual void TerminateWindowProcedure()
        {
            if (NewWindowProcedure == null)
            {
                return;
            }

            User32.SetWindowLongPtr(HandledWindow, -4, OldWindowProcedurePtr);
            HandledWindow         = new HandleRef(null, IntPtr.Zero);
            OldWindowProcedurePtr = IntPtr.Zero;
            NewWindowProcedurePtr = IntPtr.Zero;
            NewWindowProcedure    = null;
        }
        private void InitializeWindowProcedure()
        {
            if (NewWindowProcedure != null)
            {
                return;
            }

            Initialized = true;

            NewWindowProcedure    = WindowProcedures;
            NewWindowProcedurePtr = Marshal.GetFunctionPointerForDelegate(NewWindowProcedure);
            OldWindowProcedurePtr = User32.SetWindowLongPtr(HandledWindow, -4, NewWindowProcedurePtr);
        }
        private void TerminateWindowProcedure()
        {
            if (NewWindowProcedure == null)
            {
                return;
            }

            Initialized = false;

            User32.SetWindowLongPtr(HandledWindow, -4, OldWindowProcedurePtr);
            OldWindowProcedurePtr = IntPtr.Zero;
            NewWindowProcedurePtr = IntPtr.Zero;
            NewWindowProcedure    = null;
        }