Ich kodiere eine Live Control/Remote-Desktop-Lösung mit dem kostenlosen Spiegeltreiber von DFMirage. Es gibt ein C# -Probe, wie der Spiegeltreiber here interagiert und gesteuert wird. Sie müssten den Spiegeltreiber zuerst installiert haben, natürlich here. Das Konzept besteht also darin, dass der Client (Helfer) eine Bildschirmaktualisierung anfordert und der Server (Opfer) einen sendet, der die rohe Pixelcodierung verwendet. Das Konzept eines Mirror-Treibers macht teure Änderungen an Bildschirmänderungen überflüssig, weil ein Mirror-Treiber in Echtzeit über alle Zeichenoperationen informiert wird. Der Spiegeltreiber empfängt den Ort und die Größe des Aktualisierungsrechtecks und kann einfach den Speicher nach den neuen Pixelbytes abfragen und sie senden.Rohe Bitmap-Daten/Scan-Zeilen (Spiegel-Treiber-Rohdaten)?
Sollte einfach sein, außer dass ich nicht weiß, wie man das Teil, wo wir Speicher für die neuen Pixel Bytes abfragen. Das Beispiel zeigt, wie Speicher abfragen, um die Pixel des gesamten Bildschirm zu greifen, um etwas mit rohen Bitmap-Daten und Bildzeilen und schreiten und all das gute Zeug:
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;
Das ist großartig und funktioniert gut. Das resultierende Bitmap
Objekt hat jetzt die Pixel des gesamten Bildschirms. Aber wenn ich nur ein Rechteck von Pixeldaten extrahieren möchte, anstatt die Pixeldaten vom gesamten Bildschirm zu bekommen, wie könnte ich das tun? Ich denke, das ist eher eine Frage von rawbitmap-scan-stride, aber ich habe alles eingegeben, damit Sie wissen, woher das kommt. Also irgendwelche Erkenntnisse darüber, wie man nur einen Teil der Pixeldaten anstelle der gesamten Pixeldaten des Bildschirms erhält?
Update: Etwas gefunden interesting (nur Codeteil).