/// <summary>
        /// 开始录制
        /// </summary>
        /// <returns>是否成功</returns>
        public bool Start()
        {
            if (this._IsStarted)
            {
                return(false);
            }
            this._IsStarted = true;
            int nSleep = m_nSleep;

            Win32.RECT rect = new Win32.RECT();
            new Thread(() => {
                while (_IsStarted)
                {
                    if (m_hWnd != IntPtr.Zero)      //如果指定了句柄 录制该窗体区域
                    {
                        if (Win32.GetWindowRect(m_hWnd, ref rect))
                        {
                            m_rect = rect.ToRectangle();
                        }
                        else
                        {
                            _IsStarted = false;
                            lock (this._Frames) {
                                if (this._Frames.Count == 0)
                                {
                                    this.OnRecordError(new RecordErrorEventArgs("[" + m_hWnd.ToString("X8") + "]" + new Win32Exception(Marshal.GetLastWin32Error()).Message));
                                }
                            }
                            break;
                        }
                    }
                    Image img      = this.GetScreen(m_rect);
                    string strHash = this.GetImageHash(img);
                    if (strHash == m_strLastHash)
                    {
                        nSleep += m_nSleep;         //如果和上一帧数据重复 则不添加帧 多添加一轮延时
                    }
                    else
                    {
                        if (_IsStarted)
                        {
                            lock (this._Frames) this._Frames.Add(img, nSleep);
                        }
                        nSleep        = m_nSleep;
                        m_strLastHash = strHash;
                    }
                    Thread.Sleep(m_nSleep);
                }
            })
            {
                IsBackground = true
            }.Start();
            return(true);
        }
Beispiel #2
0
        private void imageCroppingBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (m_ptCurrent == e.Location)
            {
                return;
            }
            m_ptCurrent = e.Location;
            if (imageCroppingBox1.IsLockSelected)                       //如果已经锁定了选取 则有可能是正在进行后期绘制
            {
                imageCroppingBox1.Cursor = imageCroppingBox1.SelectedRectangle.Contains(e.Location) ? Cursors.Cross : Cursors.Default;
                if (m_bDrawEffect)
                {
                    this.DrawEffects();                                                //如果说在mousedown中设置了绘制标识 那么则表示是在进行后期绘制
                }
                else if (imageCroppingBox1.SelectedRectangle.Contains(e.Location))     //如果没有设置绘制标识 判断鼠标是否在选取内
                {
                    imageCroppingBox1.Invalidate(imageCroppingBox1.SelectedRectangle); //重绘选取 以便在paint绘制画笔大小预览(圆和矩形的那个)
                }
                return;
            }//如果已经锁定选取 那么直接return掉
            //在mousemove中还有可能是正在根据鼠标位置自动框选窗体 以下代码为获取窗体信息
            string strText      = string.Empty;
            string strClassName = string.Empty;

            m_bDrawInfo = !(imageCroppingBox1.IsSelected || e.Button != MouseButtons.None);
            if (!m_bDrawInfo)
            {
                return;                                                 //如果已经有选取 或者移动过程中有鼠标被点下 都不需要获取窗体信息了
            }
            IntPtr hWnd = Win32.GetWindowFromPoint(e.Location.X, e.Location.Y, this.Handle, m_bGetVisable, m_bGetTransparent);

            m_hWnd       = hWnd;                                                //更具鼠标位置获取窗体句柄
            strClassName = Win32.GetClassName(hWnd);
            strText      = Win32.GetWindowText(hWnd);
            Win32.RECT rect = new Win32.RECT();
            Win32.GetWindowRect(hWnd, ref rect);                                   //获取窗体大小
            m_rect = rect.ToRectangle();
            if (m_bSpyWeb && strClassName.ToLower() == "internet explorer_server") //如果说当前窗体是webbrowser控件 并且有设置进行spy
            {
                var element = Win32.GetHtmlDocument(hWnd).elementFromPoint(e.Location.X - rect.Left, e.Location.Y - rect.Top);
                if (element != null)
                {
                    var p = ((mshtml.IHTMLElement2)element).getBoundingClientRect();        //获取当前鼠标下的html元素信息
                    m_rect.X      = rect.Left + p.left;
                    m_rect.Y      = rect.Top + p.top;
                    m_rect.Width  = p.right - p.left;
                    m_rect.Height = p.bottom - p.top;
                    string strInner = element.innerText == null ? "null" : element.innerText.Trim().Split('\n')[0];
                    strText = string.Format("<{0}>innerText:[{1}]", element.tagName, strInner + (strInner.Length == 1 ? "" : "..."));
                    if (strText.Length > 100)
                    {
                        strText = strText.Substring(0, 100) + "...]";
                    }
                }
            }
            m_strShow = string.Format("TEXT:{0}\r\nHWND:0x{1} [{2}]", strText, hWnd.ToString("X").PadLeft(8, '0'), strClassName);
            if (m_rectScreen.X < 0)
            {
                m_rect.X -= m_rectScreen.X;                         //判断一下屏幕的坐标是否是小于0的 如果是 则在绘制区域的时候需要加上这个差值
            }
            if (m_rectScreen.Y < 0)
            {
                m_rect.Y -= m_rectScreen.Y;                         //多显示器屏幕坐标可能是负数{如(-1920,0)两个显示器 主显示器在右边} 在绘制的时候窗体内部坐标是0开始的 需要转换
            }
            m_rect.Intersect(imageCroppingBox1.DisplayRectangle);   //确定出来的区域和截图窗体的区域做一个交集 (不能让区域超出屏幕啊 比如屏幕边缘有个窗体 那么框选出来的区域是超出屏幕的)
            imageCroppingBox1.Invalidate();
        }