我正在使用DFMirage的免費鏡像驅動程序編寫實時控制/遠程桌面解決方案。有關於如何連接和控制鏡像驅動程序的C#示例here。您需要先安裝鏡像驅動程序,當然,需要安裝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(僅限代碼部分)。