Je suis en train de coder une solution de contrôle à distance/bureau à distance en utilisant le pilote miroir libre de DFMirage. Il existe un exemple C# sur la façon d'interfacer et de contrôler le pilote miroir here. Vous auriez besoin du pilote miroir installé en premier, bien sûr, here. Ainsi, le concept est, le client (assistant) demande une mise à jour de l'écran, et le serveur (victime) en envoie un, en utilisant un codage brut des pixels. Le concept d'un pilote miroir élimine le besoin d'interroger de manière coûteuse les modifications d'écran, car un pilote miroir est averti de toutes les opérations de dessin d'écran en temps réel. Le pilote miroir reçoit l'emplacement et la taille du rectangle de mise à jour et peut simplement interroger la mémoire pour les nouveaux octets de pixels et les envoyer.Données bitmap brutes/lignes de balayage (données brutes du pilote miroir)?
Devrait être facile, sauf que je ne sais pas comment faire cette partie où nous interroger la mémoire pour les nouveaux octets de pixel. L'exemple montre comment interroger la mémoire pour saisir les pixels de l'écran entier en utilisant quelque chose avec des données bitmap brutes et les lignes de balayage et la foulée et toutes ces bonnes choses:
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;
C'est grand et fonctionne très bien. L'objet Bitmap
résultant a maintenant les pixels de l'écran entier. Mais si je voulais simplement extraire un rectangle de données de pixels au lieu d'obtenir les données de pixels de l'ensemble de l'écran, comment pourrais-je faire cela? Je suppose que c'est plus une question rawbitmap-scan-stride, mais j'ai tapé tout cela pour que vous sachiez d'où cela vient. Donc, un aperçu sur la façon d'obtenir juste une partie des données de pixels au lieu de l'ensemble des données de pixel de l'écran?
Mise à jour: trouvé quelque chose interesting (portion de code uniquement).