예제 #1
0
            /// <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);
            }
예제 #2
0
        /// <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);