屏幕监控简单说就是对进程的当前桌面进行截屏存成位图,然后将此位图数据传输到远程。
对桌面进行截图需要通过一系列Windows GDI API来完成的。
首先通过CreateDC,CreateCompatibleDC,CreateCompatibleBitmap,SelectObject等API将“DISPLAY”驱动器的设备上下文与位图句柄关联起来。
然后通过GetStockObject,GetDC,SelectPalette等API处理调色板。
最后在一个循环中通过GetDIBits将所有水平线像素数据存入到缓冲区中去。
这个缓冲区就是我们想要的位图数据,只要将这些数据组织一下,就可以当成位图显示出来了。通过连续传输位图,就可以实时对远程屏幕进行监控了。
//===================================================================================================================================
DC(Device Context)设备描述表,又称
设备上下文
。
设备描述表是一个定义一组图形对象及其属性、影响输出的图形方式(数据)结构。windows提供设备描述表,用于应用程序和
物理设备之间进行交互,从而提供了应用程序设计的平台无关性。设备描述表又称为
设备上下文,或者设备环境。
设备描述表是一种
数据结构,它包括了一个设备(如显示器和打印机)的绘制属性相关的信息。所有的绘制操作通过设备描述表进行。设备描述表与大多 WIN32结构不同,应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的
句柄间接访问该结构。
句柄
句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个
指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
//====================================================================================================================================
CreateDC():
函数功能:该函数通过使用指定的名字为一个设备创建
设备上下文环境。
函数原型:HDC CreateDC(LPCTSTR lpszDrive, LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE *lplnitData);
CreateCompatibleDC()
函数功能:该函数创建一个与指定设备兼容的内存
设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联
函数原型:HDC CreateCompatibleDC(HDC hdc);
CreateCompatibleBitmap():
函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
SelectObject()
函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)
GetStockObject()
函数功能:该函数检索预定义的备用笔、刷子、
字体或者
调色板的句柄。
函数原型: HGDIOBJ GetStockObject(int fnObject);
GetDC()
函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示
设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图 。
函数原型:HDC GetDC(HWND hWnd);
SelectPalette()
函数功能:该函数选择指定的逻辑调色板到一个设备环境中。
函数原型:HPALETTE SelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground);
GetDIBits()
函数功能:GetDIBits函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图(Device-Independent Bitmap)使用的指定格式复制到一个缓冲区中。
函数原型:int GetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbi, UINT uUsage);