コード例 #1
0
        protected unsafe override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
            // #define WM_WINDOWPOSCHANGED 0x0047
            // #define SWP_NOZORDER 0x0004
            case 0x47:
                WINDOWPOS *ppos = (WINDOWPOS *)m.LParam;
                if (ppos == null || (ppos->flags & 4) == 0)
                {
                    DocManager.SetActiveDocument(typeof(LevelDoc), m_doc);
                    DocManager.SetCommandTarget(this);
                }
                break;

            // #define WM_NCACTIVATE                   0x0086
            case 0x86:
                if (((ushort)m.WParam) != 0)
                {
                    DocManager.SetCommandTarget(this);
                }
                break;
            }

            base.WndProc(ref m);
        }
コード例 #2
0
        private IntPtr ChildHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_WINDOWPOSCHANGING)
            {
                unsafe
                {
                    WINDOWPOS *pWindowPos = (WINDOWPOS *)lParam;
                    pWindowPos->flags |= SWP_NOCOPYBITS;
                }
            }
            else if (msg == WM_CHILDACTIVATE || msg == WM_MOUSEACTIVATE)
            {
                SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
            }
            else if (msg == WM_ERASEBKGND)
            {
                handled = true;
                return(new IntPtr(1));
            }

            return(IntPtr.Zero);
        }
コード例 #3
0
            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));
            }
コード例 #4
0
        private unsafe IntPtr WndProc(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            const int WM_ENTERMENULOOP = 0x0211;
            const int WM_EXITMENULOOP  = 0x0212;

            switch (message)
            {
            case 0x0002:     // WM_DESTROY
                _source.WndProcCallback = null;
                foreach (var tuple in GetViews(hwnd))
                {
                    tuple.Item1.Close();
                }
                lock (_HookedWindows)
                {
                    _HookedWindows.Remove(_source.Handle);
                    _source.Dispose();
                }
                break;

            case 0x0047:                              //WM_WINDOWPOSCHANGED
                WINDOWPOS *windowPos = (WINDOWPOS *)lParam;
                if ((windowPos->flags & 0x0002) != 0) // SWP_NOMOVE
                {
                    break;
                }
                foreach (var tuple in GetViews(hwnd))
                {
                    tuple.Item1.OnUpdateRootBounds();
                }
                break;

            case 0x0231:     // WM_ENTERSIZEMOVE
                foreach (var tuple in GetViews(hwnd))
                {
                    tuple.Item1.OnRootResizeBegin(EventArgs.Empty);
                }
                break;

            case 0x0232:     // WM_EXITSIZEMOVE
                foreach (var tuple in GetViews(hwnd))
                {
                    tuple.Item1.OnRootResizeEnd(EventArgs.Empty);
                }
                break;

            case 0x0112:     // WM_SYSCOMMAND
                const int SC_KEYMENU = 0xF100;
                // Menu loop must not be runned with Alt key
                if ((int)(wParam.ToInt64() & 0xFFF0) == SC_KEYMENU && lParam == IntPtr.Zero)
                {
                    handled = true;
                }
                break;

            case WM_ENTERMENULOOP:
                if (wParam == IntPtr.Zero)
                {
                    CefApi.SetOSModalLoop(true);
                }
                break;

            case WM_EXITMENULOOP:
                if (wParam == IntPtr.Zero)
                {
                    CefApi.SetOSModalLoop(false);
                }
                break;
            }
            return(IntPtr.Zero);
        }
コード例 #5
0
ファイル: SnapForm.cs プロジェクト: tferega/terra-gen
        /// <summary>
        /// Creates a report cotaining all data about the position of the form.
        /// </summary>
        /// <param name="wp">Pointer to WINDOWPOS structure.</param>
        /// <returns>A report cotaining all data about the position of the form.</returns>
        unsafe private string ReportWP(WINDOWPOS *wp)
        {
            string report, s;

            report = string.Format("L:({0:D4},{1:D4})  |  S:({2:D4},{3:D4})  |  ", wp->x, wp->y, wp->cx, wp->cy);
            s      = Convert.ToString(wp->flags, 2);
            for (int n = s.Length - 1; n >= 0; n--)
            {
                if (s[n] == '1')
                {
                    switch ((int)Math.Pow(2, s.Length - n - 1))
                    {
                    case 0x0001:
                        report += "SWP_NOSIZE, ";
                        break;

                    case 0x0002:
                        report += "SWP_NOMOVE, ";
                        break;

                    case 0x0004:
                        report += "SWP_NOZORDER, ";
                        break;

                    case 0x0008:
                        report += "SWP_NOREDRAW, ";
                        break;

                    case 0x0010:
                        report += "SWP_NOACTIVATE, ";
                        break;

                    case 0x0020:
                        report += "SWP_FRAMECHANGED, ";
                        break;

                    case 0x0040:
                        report += "SWP_SHOWWINDOW, ";
                        break;

                    case 0x0080:
                        report += "SWP_HIDEWINDOW, ";
                        break;

                    case 0x0100:
                        report += "SWP_NOCOPYBITS, ";
                        break;

                    case 0x0200:
                        report += "SWP_NOOWNERZORDER, ";
                        break;

                    case 0x0400:
                        report += "SWP_NOSENDCHANGING, ";
                        break;
                    }
                }
            }

            if (report.EndsWith(", "))
            {
                report = report.Remove(report.Length - 2, 2);
            }
            if (report.EndsWith(" | "))
            {
                report = report.Remove(report.Length - 3, 3);
            }

            if (wp->flags > 0)
            {
                report += "  |  " + wp->flags.ToString() + "; " + Convert.ToString(wp->flags, 2);
            }

            return(report);
        }