天天看點

C#實作類似QQ的螢幕截圖程式 轉

C#實作類似qq的螢幕截圖程式 轉

2007-5-03

因為近來想寫個類似于遠端桌面監控的程式,該程式中要用到螢幕捕捉.為實作該程式的一部分功能,做了個小DEMO.程式很簡單,用到的技術也不多,隻能實作類似qq的截圖功能(方法雖然很笨)

程式流程如下:

1.截取整個螢幕并儲存

2.新開一個全屏視窗,将儲存的螢幕作為背景

3.滑鼠拖動改變截取範圍,右鍵取消

4.輕按兩下截取,儲存在粘貼闆,全屏視窗關閉

好了,下面的是代碼部分

首先建立一個項目ScreenCutter(VS2005),将窗體名改為MainForm,再建立一個窗體ScreenBody.

添加一個按鈕btnCutter到ScreenCutter并添加按鈕事件:

         private   void  btnCutter_Click( object  sender, EventArgs e)

        {

            Image img  =   new  Bitmap(Screen.AllScreens[ 0 ].Bounds.Width, Screen.AllScreens[ 0 ].Bounds.Height);

            Graphics g  =  Graphics.FromImage(img);

            g.CopyFromScreen( new  Point( 0 ,  0 ),  new  Point( 0 ,  0 ), Screen.AllScreens[ 0 ].Bounds.Size);

            ScreenBody body  =   new  ScreenBody();

            body.BackgroundImage  =  img;

            body.Show();

        } Screen.AllScreens[0]是擷取目前所有裝置視窗的第一個,我這裡隻有一個顯示器,當然我就是第一個.

利用Graphics的CopyFromScreen函數擷取目前螢幕.

好了,現在按下按鈕全屏視窗就會出來了.

下面講全屏視窗ScreenBody,首先設定窗體的FormBorderStyle為None,然後聲明以下變量

private  Graphics MainPainter;  //主畫筆

private  Pen pen;               //就是筆咯

private   bool  isDowned;         //判斷滑鼠是否按下

private   bool  RectReady;         //矩形是否繪制完成

private  Image baseImage;       //基本圖形(原來的畫面)

private  Rectangle Rect;        //就是要儲存的矩形

private  Point downPoint;        //滑鼠按下的點

int  tmpx;                    

int  tmpy;

之後就是窗體的滑鼠函數了,裡面很多代碼都沒有作出整理,看了一下,整理後的代碼應該會更少更精簡的

private   void  ScreenBody_DoubleClick( object  sender, EventArgs e)

{

     if  (((MouseEventArgs)e).Button  ==  MouseButtons.Left  && Rect.Contains(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y))

    {

        //儲存的時候有很多種方法的......我這裡隻用了這種

        Image memory  =   new  Bitmap(Rect.Width, Rect.Height);

        Graphics g  =  Graphics.FromImage(memory);

        g.CopyFromScreen(Rect.X  +   1 , Rect.Y  +   1 ,  0 ,  0 , Rect.Size);

        Clipboard.SetImage(memory);

         this .Close();

    }

}

private   void  ScreenBody_MouseDown( object  sender, MouseEventArgs e)

{

     if  (e.Button  ==  MouseButtons.Left)

    {

        isDowned  =   true ;

         if  (RectReady  ==   false )

        {

            Rect.X  =  e.X;

            Rect.Y  =  e.Y;

            downPoint  =   new  Point(e.X, e.Y);

        }

         if  (RectReady  ==   true )

        {

            tmpx  =  e.X;

            tmpy  =  e.Y;

        }

    }

     if  (e.Button  ==  MouseButtons.Right)

    {

         if  (RectReady  !=   true )

        {

             this .Close();

             return ;

        }

        MainPainter. DrawImage(baseImage,  0 ,  0 );

        RectReady  =   false ;

    }

}

private   void  ScreenBody_MouseUp( object  sender, MouseEventArgs e)

{

     if  (e.Button  ==  MouseButtons.Left)

    {

        isDowned  =   false ;

        RectReady  =   true ;

    }

}

private   void  ScreenBody_MouseMove( object  sender, MouseEventArgs e)

{

     if  (RectReady  ==   false )

    {

         if  (isDowned  ==   true )

        {

            Image New  =  DrawScreen((Image)baseImage.Clone(), e.X, e.Y);

            MainPainter.DrawImage(New,  0 ,  0 );

            New.Dispose();

        }

    }

     if  (RectReady  ==   true )

    {

         if  (Rect.Contains(e.X, e.Y))

        {

             // this.Cursor = Cursors.Hand;

             if  (isDowned  ==   true )

            {

                 // 和上一次的位置比較擷取偏移量

                Rect.X  =  Rect.X  +  e.X  -  tmpx;

                Rect.Y  =  Rect.Y  +  e.Y  -  tmpy;

                 // 記錄現在的位置

                tmpx  =  e.X;

                tmpy  =  e.Y;

                MoveRect((Image)baseImage.Clone(), Rect);

            }

        }

    }

}

private   void  ScreenBody_Load( object  sender, EventArgs e)

{

     this .WindowState  =  FormWindowState.Maximized;

    MainPainter  =   this .CreateGraphics();

    pen  =   new  Pen(Brushes.Blue);

    isDowned  =   false ;

    baseImage  =   this .BackgroundImage;

    Rect  =   new  Rectangle();

    RectReady  =   false ;

}

輔助函數

本來應該寫更多的輔助函數的,将窗體響應函數裡面的代碼放到裡面來,不過本人很懶,就這樣将就了.呵呵

private   void  DrawRect(Graphics Painter,  int  Mouse_x,  int  Mouse_y)

{

     int  width  =   0 ;

     int  heigth  =   0 ;

     if  (Mouse_y  <  Rect.Y)

    {

        Rect.Y  =  Mouse_y;

        heigth  =  downPoint.Y  -  Mouse_y;

    }

     else

    {

        heigth  =  Mouse_y  -  downPoint.Y;

    }

     if  (Mouse_x  <  Rect.X)

    {

        Rect.X  =  Mouse_x;

        width  =  downPoint.X  -  Mouse_x;

    }

     else

    {

        width  =  Mouse_x  -  downPoint.X;

    }

    Rect.Size  =   new  Size(width, heigth);

    Painter.DrawRectangle(pen, Rect);

}

private  Image DrawScreen(Image back,  int  Mouse_x,  int  Mouse_y)

{

    Graphics Painter  =  Graphics.FromImage(back);

    DrawRect(Painter, Mouse_x, Mouse_y);

     return  back;

}

private   void  MoveRect(Image image, Rectangle Rect)

{

    Graphics Painter  =  Graphics.FromImage(image);

    Painter.DrawRectangle(pen, Rect.X, Rect.Y, Rect.Width, Rect.Height);

    DrawRects(Painter);

    MainPainter.DrawImage(image,  0 ,  0 );

    image.Dispose();

}  

繼續閱讀