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); }
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); }
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)); }
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); }
/// <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); }