当前位置:  -> 首页 -> 原创文章 -> 捕获屏幕图像(兼容屏幕保护模式)

上一篇 | 下一篇
捕获屏幕图像(兼容屏幕保护模式)
作者:洛羽叶  点击率:5099  发布时间:2012-03-21

 
                            /* 获取图像 */

//定义变量                        
                            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;
                            }
标签: C# .NET 屏幕
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:13
今日访问:655
总访问量:1936486
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006