当前位置:编程学习 > C#/ASP.NET >>

如何使屏幕捕捉的显示速度加快,内附代码??

我在做一个屏幕捕捉程序,像QQ那样的
完成运行,被捕捉的机器的速度奇慢无比,查看方的显示的当然也是慢的,有什么方法可以降低CPU使用率或着修改哪些地方可以提高性能?
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;
namespace THClient
{
     public partial class Form1 : Form
     {
     //     private Socket socket = null;
         private NetworkStream ns = null;
         private StreamReader sr = null;
         private StreamWriter sw = null;
         private Thread tcpThread = null;
         private TcpClient tcpclient = null;
         MemoryStream ms = null;
         bool isCon = false;
         bool isError = false;
         
         
         public Form1()
         {
             InitializeComponent();
       
         }
       
     
         [System.Runtime.InteropServices.DllImport("gdi32.dll")]
         private static extern IntPtr CreateDC(
               string lpszDriver, // 驱动名称
               string lpszDevice, // 设备名称
               string lpszOutput, // 无用,可以设定位"NULL"
               IntPtr lpInitData // 任意的打印机数据
             );
         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
         private static extern bool BitBlt(
         IntPtr hdcDest, //目标设备的句柄
         int nXDest, // 目标对象的左上角的X坐标
         int nYDest, // 目标对象的左上角的X坐标
         int nWidth, // 目标对象的矩形的宽度
         int nHeight, // 目标对象的矩形的长度
         IntPtr hdcSrc, // 源设备的句柄
         int nXSrc, // 源对象的左上角的X坐标
         int nYSrc, // 源对象的左上角的X坐标
         System.Int32 dwRop // 光栅的操作值
         );
         public void capture()
         {
             //this.Visible = false;
             IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
             //创建显示器的DC
             Graphics g1 = Graphics.FromHdc(dc1);
             //由一个指定设备的句柄创建一个新的Graphics对象
             System.Drawing.Image MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 

Screen.PrimaryScreen.Bounds.Height, g1);
             //根据屏幕大小创建一个与之相同大小的Bitmap对象
             Graphics g2 = Graphics.FromImage(MyImage);
             //获得屏幕的句柄
             IntPtr dc3 = g1.GetHdc();
             //获得位图的句柄
             IntPtr dc2 = g2.GetHdc();
             //把当前屏幕捕获到位图对象中
             BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 

13369376);
             //把当前屏幕拷贝到位图中
             g1.ReleaseHdc(dc3);
             //释放屏幕句柄
             g2.ReleaseHdc(dc2);
             //释放位图句柄
             ms = new MemoryStream();
             MyImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
             byte[] b =ms.GetBuffer();
             ns.Write(b, 0, b.Length);
             ms.Flush();
            // this.pictureBox1.Image = Image.FromStream(ms);
             //this.Visible = true;
             
           
         }
         private void Form1_Load(object sender, EventArgs e)
         {
             this.label1.Text = "程序启动中....\r\n";
             timer1.Enabled = true;
         }
         public void connect()
         {
              try
             {
                 
                  while (true)
                 {
                    capture();
                 }
               
             }
             catch(Exception ex)
             {
               //   MessageBox.Show(ex.Message);
               //   MessageBox.Show("错误!===\\\\"+ex.Message );
                 sw.Dispose();
                 sr.Dispose();
                 ns.Dispose();
                 isCon = false;
                 isError = false;
                 timer1.Enabled = true;
                 this.label1.Text += "远程主机被断开~!";
             }
         }
         //关闭所有流
         private void Form1_Closing(object sender,System.ComponentModel.CancelEventArgs e)
         {
           
         }
         private void timer1_Tick(object sender, EventArgs e)
         {
             if (!isCon)
             {
                con();
                if (!isError)
                {
                 timer1.Enabled = false;
                tcpThread = new Thread(new ThreadStart(connect));
                tcpThread.Start();
               
                }
                isError = false;
             }
         }
         public void con()
         {
             try
             {
                 this.label1.Text += "连接中.....\r\n";
                 tcpclient = new TcpClient();
                 tcpclient.Connect("192.168.1.3", 9420);
                 if (tcpclient.Connected)
                 {
                     ns = tcpclient.GetStream();
                     sr = new StreamReader(ns);
                     sw = new StreamWriter(ns);
                     isCon = true;
                     this.label1.Text += "连接成功\r\n";
                 }
                 //isError = true;
             }
             catch
             {
                 isError= true;
                 this.label1.Text += "连接失败!\r\n";
             }
         }

     }  --------------------编程问答-------------------- 有人能指點一下吗??? --------------------编程问答-------------------- 先锁定屏幕,然后得出屏幕图像以及选择框的面积与坐标,再取出相应面积的图片,垃圾回收。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,