VC 實現對遠端計算機螢幕的監視

2021-04-13 23:21:37 字數 3478 閱讀 6915

vc++實現對遠端計算機螢幕的監視

其中af_inet 和sock_stream指定了建立的是採用了tcp/ip位址族的流式套接字。該套接字實際上是提供了乙個通訊埠,通過這個埠可與任何乙個具有套接字埠的計算機實施通訊。一旦獲取了新的套接字,應立即通過bind()將該套接字與本機上的乙個埠建立關聯。需要預先對乙個指向包含有本機ip位址和埠資訊的sockaddr_in結構填充一些必要的資訊,如本地埠號和本地主機位址等,並通過bind()將伺服器程序在網路上標識出來:

sockin_s.sin_family=af_inet;

sockin_s.sin_addr.s_addr=0;

sockin_s.sin_port=htons(port);

bind(sock,(lpsockaddr)&sockin_s,sizeof(sockin_s));

在這裡通過wsaasyncselect()非同步選擇函式來以非同步的形式響應關心的網路事件fd_close,並在該事件發生時發出自定義wm_msg訊息,通過響應這個訊息可以得之當前與伺服器聯絡的客戶機程式已關閉退出,由於伺服器部分是執行於遠端工程現場的,為了使控制中心的監控程式(客戶)在下次發出監控請求時能為其提供服務需要在wm_msg的訊息響應函式裡關閉由accept() 所產生的新的套接字newskt_s,並重新啟動該執行緒等待監控程式的再次連線。在accept()函式成功返回後,就可以在定時器響應函式裡用send() 函式與之建立了連線的監控主機定時傳送捕獲的遠端螢幕資訊了。

作為客戶的監控程式,其實現過程要比伺服器簡單許多。由於需要接收資料,因此在非同步選擇函式中需要設定待監測的網路事件為fd_close和fd_read。在訊息響應函式中可以通過對訊息引數的低位位元組進行判斷而區分出具體發生是何種網路事件,並對其做出響應的反應。下面是監控端程式網路部分的主要**:

……ipaddr=inet_addr(strip);

sock=socket(af_inet,sock_stream,0); //建立套接字

sockin_c.sin_family=af_inet;

sockin_c.sin_addr.s_un.s_addr=ipaddr;

sockin_c.sin_port=m_port;

connect(sock,(lpsockaddr)&sockin_c,sizeof(sockin_c));//連線伺服器

……wsaasyncselect(sock,m_hwnd,wm_msg,fd_read|fd_close);

……vc++實現對遠端計算機螢幕的監視

對遠端計算機螢幕的捕捉和顯示char dot[1572864]; //1024*768*2

cbitmap bmp; //記憶體位圖

cdc wdc; //裝置環境

cdc* pdc; //指向桌面視窗的裝置環境指標

……static cwindowdc ddc(getdesktopwindow()); //引用桌面視窗指標定義物件ddc

pdc=&ddc; //將指標pdc指向ddc

wdc.createcompatibledc(pdc); //建立與ddc相容的裝置環境

bmp.createcompatiblebitmap(pdc,1024,768); //建立與ddc相容的點陣圖

wdc.selectobject(&bmp); //選擇bmp

……wdc.bitblt(0,0,1024,768,pdc,0,0,srccopy); //把桌面影象複製到wdc的bmp中

這時雖以獲取到了螢幕的資訊,並將其複製到記憶體位圖之中,但此時還不能直接將其傳送出去,需要呼叫cbitmap 類的成員函式

getbitmapbits()來將影象資訊從記憶體位圖拷貝到快取,並通過套接字的send()函式

將快取中存放的螢幕資訊通過網路從現場主機傳送到控制中心。

現場主機的螢幕資訊在控制中心的再現,基本上是螢幕擷取的逆過程:先建立乙個同客戶區相關的裝置環境並建立乙個與之相容的裝置環境,然後按位圖格式在記憶體中建立乙個與之相容的記憶體位圖。在從網路接收完一屏資訊後,通過cbitmap的成員函式

setbitmapbits()把快取中的螢幕資訊按位圖格式拷貝到記憶體位圖,最後完成對記憶體點陣圖的顯示。其主要過程如下:

cdc* pdc=getdc(); //引用使用者視窗指標定義物件pdc

wdc.createcompatibledc(pdc); //建立與pdc相容的device context

bmp.createcompatiblebitmap(pdc,1024,768); //建立與pdc相容的點陣圖

wdc.selectobject(&bmp);

……ireadlen = recv(sock,buffer,60000,0); //從網路接收資料

for(i=0;i}

服務程式的自動載入及擴充套件

從功能上看,服務端程式只負責為遠端客戶提供服務,在全部執行期間根本不需要人為的外來干預,因此可以隱藏其介面並將其作成後台服務程式:

bool cmainframe::precreatewindow(createstruct& cs)

另外,由於現在計算機多具有通過modem實現遠端喚醒的功能,因此如能使服務程式具備自啟動功能將實現遠端現場主機的無人值守。自啟動有多種方式:在autoexec.bat、win.ini等檔案中加入啟動命令、在"啟動"選單裡加入指向程式的快捷方式、修改登錄檔等。其中由於登錄檔通常被人為改動的機會要小的多,因此通過修改登錄檔實現自啟動是一種比較安全的方法。本文採取的方法是:先通過api函式

copyfile()將服務程式複製到系統目錄,然後對hkey_local_machine 的software/microsoft/windows/currentversion/run寫入乙個字串鍵值,該鍵值的內容是服務程式在系統目錄下的全路徑:

dword type=reg_sz;

dword size=max_path;

lpctstr rgspath="software//microsoft//windows//currentversion//run" ;

……getsystemdirectory(syspath,size); //獲取系統目錄

getmodulefilename(null,currentpath,size); //獲取程式路徑

filecurrentname = currentpath;

filenewname = lstrcat(syspath,"//surveillant.exe");

ret = copyfile(filecurrentname,filenewname,true); //拷貝程式到系統目錄

……//開啟登錄檔

ret=regopenkeyex(hkey_local_machine,rgspath,0,key_write, &hkey);

……//寫入登錄檔

ret=regsetvalueex(hkey,"surveillant",null,type, filenewname,size);

……//關閉登錄檔

regclosekey(hkey);

編譯通過。

VC 實現對遠端計算機螢幕的監視

摘要 本文介紹了一種通過套接字網路程式設計和螢幕捕獲技術實現的對遠端計算機螢幕進行監視的方法。函式建立之 sock socket af inet,sock stream,0 其中af inet 和sock stream指定了建立的是採用了tcp ip位址族的流式套接字。該套接字實際上是提供了乙個通訊...

VC 實現對遠端計算機螢幕的監視

介紹一種通過套接字網路程式設計和螢幕捕獲技術實現的對遠端計算機螢幕進行監視的方法。在實際工程中,經常有施工現場和控制中心不在一起的情況,在這種情況一般多由工程技術人員往返穿梭其間來實現對遠端施工現場的情況了解和對控制中心的矯正控制。顯然這種工作方式的效率是很低下的,沒有充分發揮計算機網路的強大優勢,...

通過Socket套接字實現對計算機的遠端監控

一 引言 二 socket網路程式的一般思路 windows sockets 規範定義了乙個基於 microsoft windows 的網路程式設計介面,它源於加里弗尼亞大學伯克利分校的伯克利軟體發布 bsd 它既包括熟悉的伯克利 socket 風格的例程,也包括了一組 windows 特有的擴充套...