/* 获取图像 */
//定义变量
IntPtr dcDisplay;
IntPtr dcImage;
Graphics gDisplay;
Graphics gImage;
System.IO.Stream sImage;
Image imgDisplay;
byte[] bufTemp;
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameter myEncoderParameter1;
EncoderParameters myEncoderParameters;
try
{
//初始化二进制存储流
sImage=new System.IO.MemoryStream();
//获取绘图句柄
dcDisplay= WIN32Api.CreateDC("DISPLAY",null, null, IntPtr.Zero);
gDisplay=Graphics.FromHdc(dcDisplay);
//创建图像
imgDisplay = new Bitmap((int)(gDisplay.VisibleClipBounds.Width) ,(int)(gDisplay.VisibleClipBounds.Height));
gImage = Graphics.FromImage(imgDisplay);
//获取HDC
dcImage = gImage.GetHdc();
//捕获屏幕
WIN32Api.StretchBlt( dcImage, 0, 0, (int)(gDisplay.VisibleClipBounds.Width) ,(int)(gDisplay.VisibleClipBounds.Height ), dcDisplay,0,0,Convert.ToInt32(gDisplay.VisibleClipBounds.Width),Convert.ToInt32(gDisplay.VisibleClipBounds.Height), 13369376);
//释放HDC
gImage.ReleaseHdc(dcImage);
WIN32Api.DeleteDC(dcDisplay);
//图像编码
myImageCodecInfo=null;
foreach(ImageCodecInfo imagecodecinfo in ImageCodecInfo.GetImageEncoders())
{
if(imagecodecinfo.MimeType=="image/jpeg")
{
myImageCodecInfo=imagecodecinfo;
break;
}
}
//处理颜色数
myEncoderParameters=new EncoderParameters(2);
myEncoder=Encoder.ColorDepth;
myEncoderParameter=new EncoderParameter(myEncoder,8L);
myEncoderParameters.Param[0]=myEncoderParameter;
myEncoder=Encoder.Quality;
myEncoderParameter1=new EncoderParameter(myEncoder,25L);
myEncoderParameters.Param[1]=myEncoderParameter1;
//保存图像数据并返回
imgDisplay.Save(sImage,myImageCodecInfo,myEncoderParameters);
bufTemp=new byte[sImage.Length];
sImage.Position=0;
sImage.Read(bufTemp,0,bufTemp.Length);
return bufTemp;
}
catch(Exception exp)
{
throw exp;
}
/*获取屏幕尺寸 */
IntPtr dcDisplay;
Graphics gDisplay;
Point pSize;
try
{
dcDisplay= WIN32Api.CreateDC("DISPLAY", null, null, IntPtr.Zero);
gDisplay=Graphics.FromHdc(dcDisplay);
pSize=new Point();
pSize.X=Convert.ToInt32(gDisplay.VisibleClipBounds.Width);
pSize.Y=Convert.ToInt32(gDisplay.VisibleClipBounds.Height);
WIN32Api.DeleteDC(dcDisplay);
return pSize;
}
catch(Exception exp)
{
throw exp;
}
/* 切换当前进程桌面,防止屏幕保护方式下无法获取桌面*/
IntPtr hThreadDesktop;
IntPtr hInputDesktop;
System.Text.StringBuilder sbTemp;
string strThreadName;
string strInputName;
int i;
try
{
i=0;
sbTemp=new System.Text.StringBuilder(256);
strThreadName="";
strInputName="";
//获取线程的桌面
hThreadDesktop=WIN32Api.GetThreadDesktop((uint)WIN32Api.GetCurrentThreadId());
hInputDesktop=WIN32Api.OpenInputDesktop(0,false,(int)DesktopConstants.MAXIMUM_ALLOWED);
//切换桌面
if(hThreadDesktop!=IntPtr.Zero && hInputDesktop!=IntPtr.Zero)
{
//获取桌面名称
WIN32Api.GetUserObjectInformation(hThreadDesktop,(int)DesktopConstants.UOI_NAME,sbTemp,256,ref i);
strThreadName=sbTemp.ToString();
//获取输入桌面名称
WIN32Api.GetUserObjectInformation(hInputDesktop,(int)DesktopConstants.UOI_NAME,sbTemp,256,ref i);
strInputName=sbTemp.ToString();
//设置线程桌面
if(strThreadName!=strInputName)
{
WIN32Api.SetThreadDesktop(hInputDesktop);
WIN32Api.CloseDesktop(hThreadDesktop);
}
}
else
{
if(hInputDesktop!=IntPtr.Zero)
WIN32Api.CloseDesktop(hInputDesktop);
}
}
catch(Exception exp)
{
throw exp;
} |