如何使屏幕捕捉的显示速度加快,内附代码??
我在做一个屏幕捕捉程序,像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#