C#實作類別似qq的螢幕截圖程式 [轉載]

來源:互聯網
上載者:User
http://blog.csdn.net/21aspnet/archive/2007/03/20/1534398.aspx
因為近來想寫個類似於遠端桌面監控的程式,該程式中要用到螢幕捕捉.為實現該程式的一部分功能,做了個小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();
}

到這裡,代碼就算是寫完了,運行

截取結果,這裡截取的邊界沒有控制好,所以還有邊界可以見到,稍微設定一下就可以了

好了,這個東東就這樣搞完了,接下來要做利用鉤子的了....希望能夠快點完成,累呀~~~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.