基于Delphi的屏幕抓圖技術(shù)的實(shí)現(xiàn)

字號(hào):

引言
    隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,計(jì)算機(jī)網(wǎng)絡(luò)在各高等院校教學(xué)中的使用已非常普遍,但是,我們發(fā)現(xiàn)一個(gè)問題,在教學(xué)的過程中,由于老師是面對(duì)著學(xué)生,而背對(duì)著學(xué)生計(jì)算機(jī)的顯示器,不能隨時(shí)查看學(xué)生計(jì)算機(jī)顯示器上的內(nèi)容,所以,有的學(xué)生在教學(xué)中偷玩游戲,影響了教學(xué)的質(zhì)量和效果,因此,設(shè)計(jì)一款網(wǎng)絡(luò)監(jiān)控軟件,監(jiān)控學(xué)生計(jì)算機(jī),十分必要。為了實(shí)現(xiàn)這一目的,此系統(tǒng)應(yīng)具有以下功能:
    (1)教師用機(jī)可以循環(huán)顯示學(xué)生計(jì)算機(jī)的顯示器上的畫面。
    (2)教師用機(jī)可以動(dòng)態(tài)顯示某一學(xué)生計(jì)算機(jī)的顯示器上的畫面。
    (3)教師用機(jī)可以對(duì)學(xué)生用計(jì)算機(jī)發(fā)出警告信息和控制信息。
    (4)學(xué)生用計(jì)算機(jī)開機(jī)自動(dòng)運(yùn)行服務(wù)端監(jiān)控程序。
    (5)為了防止學(xué)生用計(jì)算機(jī)的服務(wù)端監(jiān)控程序,被學(xué)生發(fā)現(xiàn)用Ctrl+Alt+Del關(guān)閉,在Ctrl+Alt+Del對(duì)話框中必須隱藏程序。同時(shí),應(yīng)該隱藏程序在任務(wù)欄的按鈕。
    本文結(jié)合應(yīng)用實(shí)踐,重點(diǎn)向大家介紹在Delphi7.0中可以采用的兩種實(shí)現(xiàn)屏幕抓圖技術(shù)的操作方法。
    程序?qū)崿F(xiàn)
    (1)抓取屏幕圖像的難點(diǎn)有兩個(gè):一是如何奪取屏幕的句柄,二是知道屏幕句柄后如何獲取屏幕的圖像。Borland公司的設(shè)計(jì)人員用畫布(Tcanvas)對(duì)象封裝了Windows的大部分圖形輸出功能,可以通過它以更直觀的方式和Windows的屏幕打交道,而不必關(guān)心令人頭疼的Windows API函數(shù)。具體程序如下:
    procedure TForm1.Timer1Timer(Sender:TObject);//抓取屏幕,并保存到Image控件中
    var
    Fullscreen:Tbitmap;
    FullscreenCanvas:TCanvas;
    dc:HDC;
    begin
    Fullscreen:=TBitmap.Create;
    //創(chuàng)建一個(gè)BITMAP來存放圖象
    Fullscreen.Width:=screen.width;
    Fullscreen.Height:=screen.Height;
    DC:=GetDC(0); //取得屏幕的DC,參數(shù)0指的是屏幕
    FullscreenCanvas:=TCanvas.Create;
    //創(chuàng)建一個(gè)CANVAS對(duì)象
    FullscreenCanvas.Handle:=DC;
    Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),
    fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));
    //把整個(gè)屏幕復(fù)制到BITMAP中
    FullscreenCanvas.Free;
    //釋放CANVAS對(duì)象
    ReleaseDC(0,DC); //釋放DC
    //*******************************
    image1.picture.Bitmap:=fullscreen; //拷貝下的圖象賦給IMAGE對(duì)象
    image1.Width:=fullscreen.Width;
    image1.Height:=fullscreen.Height;
    fullscreen.free; //釋放bitmap
    form1.WindowState:=wsNormal; //復(fù)原窗口狀態(tài)
    form1.show; //顯示窗口
    messagebeep(1); //BEEP叫一聲,報(bào)告圖象已經(jīng)截取好了。
    end;