【发布时间】:2010-07-03 17:32:56
【问题描述】:
我正在使用 DFMirage 的免费镜像驱动程序编写实时控制/远程桌面解决方案。有一个关于如何接口和控制镜像驱动程序here 的 C# 示例。您需要先安装镜像驱动程序,当然,here。所以,这个概念是,客户端(助手)请求屏幕更新,服务器(受害者)使用原始像素编码发送一个。镜像驱动的概念消除了昂贵轮询屏幕变化的需要,因为镜像驱动被实时通知所有屏幕绘制操作。镜像驱动程序接收更新矩形的位置和大小,并且可以简单地查询内存以获取新的像素字节并发送它们。
应该很简单,除了我不知道如何执行我们查询内存以获取新像素字节的那部分。该示例展示了如何使用原始位图数据、扫描线和步幅以及所有这些好东西来查询内存以获取整个屏幕的像素:
Bitmap result = new Bitmap(_bitmapWidth, _bitmapHeight, format);
Rectangle rect = new Rectangle(0, 0, _bitmapWidth, _bitmapHeight);
BitmapData bmpData = result.LockBits(rect, ImageLockMode.WriteOnly, format);
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
int bytes = bmpData.Stride * _bitmapHeight;
var getChangesBuffer = (GetChangesBuffer)Marshal
.PtrToStructure(_getChangesBuffer, typeof (GetChangesBuffer));
var data = new byte[bytes];
Marshal.Copy(getChangesBuffer.UserBuffer, data, 0, bytes);
// Copy the RGB values into the bitmap.
Marshal.Copy(data, 0, ptr, bytes);
result.UnlockBits(bmpData);
return result;
这很好,工作正常。生成的Bitmap 对象现在具有整个屏幕的像素。但是如果我只想提取一个矩形的像素数据而不是从整个屏幕中获取像素数据,我怎么能做到呢?我想这更像是一个 rawbitmap-scan-stride 问题,但我输入了所有这些,所以你可能知道这是从哪里来的。那么对于如何获取部分像素数据而不是整个屏幕的像素数据有什么见解吗?
更新:发现了一些东西 interesting(仅代码部分)。
【问题讨论】:
标签: c# driver remote-desktop