protected override IntPtr WndProcOverride(HWND hwnd, WM msg, IntPtr wParam, IntPtr lParam, IntPtr id, IntPtr data)
            {
                IntPtr? result = null;

                if (msg == WM.WINDOWPOSCHANGING) {
                    unsafe
                    {
                        WINDOWPOS* pWindowPos = (WINDOWPOS*)lParam;

                        CopyBitsBehavior copyBitsBehavior = _hwndHost.GetCopyBitsBehavior();

                        switch (copyBitsBehavior) {
                            case CopyBitsBehavior.AlwaysCopyBits:
                                pWindowPos->flags &= ~SWP.NOCOPYBITS;
                                break;

                            case CopyBitsBehavior.CopyBitsAndRepaint:
                                pWindowPos->flags &= ~SWP.NOCOPYBITS;
                                if (!_redrawMessagePosted) {
                                    NativeMethods.PostMessage(hwnd, _redrawMessage, IntPtr.Zero, IntPtr.Zero);
                                    _redrawMessagePosted = true;
                                }
                                break;

                            case CopyBitsBehavior.NeverCopyBits:
                                pWindowPos->flags |= SWP.NOCOPYBITS;
                                break;

                            case CopyBitsBehavior.Default:
                            default:
                                // do nothing.
                                break;
                        }
                    }
                } else if (msg == _redrawMessage) {
                    _redrawMessagePosted = false;

                    // Invalidate the window that moved, because it might have copied garbage
                    // due to WPF rendering through DX on a different thread.
                    NativeMethods.RedrawWindow(hwnd, IntPtr.Zero, IntPtr.Zero, RDW.INVALIDATE | RDW.ALLCHILDREN);

                    // Then immediately redraw all invalid regions within the top-level window.
                    HWND hwndRoot = NativeMethods.GetAncestor(hwnd, GA.ROOT);
                    NativeMethods.RedrawWindow(hwndRoot, IntPtr.Zero, IntPtr.Zero, RDW.UPDATENOW | RDW.ALLCHILDREN);
                } else if (msg == WM.MOUSEACTIVATE) {
                    bool raiseMouseActivateCommand = _hwndHost.GetRaiseMouseActivateCommand();
                    if (raiseMouseActivateCommand) {
                        // Raise the HwndHostCommands.MouseActivate command.
                        MouseActivateParameter parameter = new MouseActivateParameter();
                        HwndHostCommands.MouseActivate.Execute(parameter, _hwndHost);

                        if (parameter.HandleMessage) {
                            if (parameter.Activate == false && parameter.EatMessage == false) {
                                result = new IntPtr((int)MA.NOACTIVATE);
                            } else if (parameter.Activate == false && parameter.EatMessage == true) {
                                result = new IntPtr((int)MA.NOACTIVATEANDEAT);
                            } else if (parameter.Activate == true && parameter.EatMessage == false) {
                                result = new IntPtr((int)MA.ACTIVATE);
                            } else // if(parameter.Activate == true && parameter.EatMessage == true)
                              {
                                result = new IntPtr((int)MA.ACTIVATEANDEAT);
                            }
                        }
                    }
                }

                return result ?? base.WndProcOverride(hwnd, msg, wParam, lParam, id, data);
            }