/// <returns>0 Cancel, 1 OK, 2 Retry.</returns> public int Show(Bitmap img, ICFlags flags, RECT r) { _img = img; _flags = flags; _cursor = MouseCursor.Load(ResourceUtil.GetBytes("<Au>resources/red_cross_cursor.cur"), 32); _dpi = screen.primary.Dpi; _w = WndUtil.CreateWindow(_WndProc, true, "#32770", "Au.uiimage.CaptureUI", WS.POPUP | WS.VISIBLE, WSE.TOOLWINDOW | WSE.TOPMOST, r.left, r.top, r.Width, r.Height); _w.ActivateL(); try { while (Api.GetMessage(out var m) > 0 && m.message != Api.WM_APP) { switch (m.message) { case Api.WM_KEYDOWN when !_capturing: switch ((KKey)(int)m.wParam) { case KKey.Escape: return(0); case KKey.F3: return(2); } break; case Api.WM_RBUTTONUP when m.hwnd == _w: switch (popupMenu.showSimple("1 Retry\tF3|2 Cancel\tEsc", owner: _w)) { case 1: return(2); case 2: return(0); } break; } Api.DispatchMessage(m); } } finally { var w = _w; _w = default; Api.DestroyWindow(w); } return(_res); }
/// <summary> /// Creates image from a user-selected area of screen pixels. Or gets single pixel color, or just rectangle. /// Returns false if cancelled. /// </summary> /// <param name="result">Receives results.</param> /// <param name="flags"></param> /// <param name="owner">Owner window. Temporarily minimizes it.</param> /// <remarks> /// Gets all screen pixels and shows in a full-screen topmost window, where the user can select an area. /// </remarks> public static bool captureUI(out ICResult result, ICFlags flags = 0, AnyWnd owner = default) { result = default; switch (flags & (ICFlags.Image | ICFlags.Color | ICFlags.Rectangle)) { case 0: case ICFlags.Image: case ICFlags.Color: case ICFlags.Rectangle: break; default: throw new ArgumentException(); } wnd wTool = default; try { if (!owner.IsEmpty) { wTool = owner.Hwnd; wTool.ShowMinimized(noAnimation: true); using (new inputBlocker(BIEvents.MouseClicks)) Au.wait.doEvents(300); //time for animations } g1: RECT rs = screen.virtualScreen; //RECT rs = screen.primary.Rect; //for testing, to see Write output in other screen Bitmap bs; bool windowPixels = flags.HasAny(ICFlags.WindowDC | ICFlags.PrintWindow); if (windowPixels) { if (!_WaitForHotkey("Press F3 to select window from mouse pointer. Or Esc.")) { return(false); } var w = wnd.fromMouse(WXYFlags.NeedWindow); var rc = w.ClientRect; using var bw = capture(w, rc, flags.Has(ICFlags.PrintWindow)); bs = new Bitmap(rs.Width, rs.Height); using var g = Graphics.FromImage(bs); g.Clear(Color.Black); w.MapClientToScreen(ref rc); g.DrawImage(bw, rc.left - rs.left, rc.top - rs.top); } else { bs = capture(rs); } var cw = new _CapturingWindow(); switch (cw.Show(bs, flags, rs)) { case 1: break; case 2: if (!windowPixels && !_WaitForHotkey("Press F3 when ready for new screenshot. Or Esc.")) { return(false); } goto g1; default: return(false); } var r = cw.Result; r.w = _WindowFromRect(r); result = r; } finally { if (wTool.IsAlive) { wTool.ShowNotMinimized(); wTool.ActivateL(); } } return(true);