2010-10-25 4 views

Répondre

5

Il existe plusieurs méthodes.

(1) Sondage à l'écran.

Vous pouvez interroger l'écran (qui est, créer un DIB, chaque période de temps à BitBlt de l'écran lui), puis de l'envoyer en l'état

Plus:

  • Très simple mettre en œuvre

Moins:

  • charge élevée du processeur. L'interrogation de l'ensemble du nombre de fois par seconde est très lourde (beaucoup de données doivent être transférées). Par conséquent, ce sera lourd et lent.
  • bande passante réseau élevée

(2) Comme ci-dessus, sauf que maintenant vous faites une analyse de l'écran sondé pour voir la différence. Alors vous pouvez envoyer seulement les différences (et évidemment n'envoyez rien si aucun changement), plus vous pouvez éventuellement compresser le flux de différences.

Plus:

  • Pas encore trop complexe à mettre en œuvre
  • considérablement la bande passante du réseau inférieur

Moins:

  • utilisation du processeur encore plus élevé.

(3) Comme ci-dessus, sauf que vous n'interrogez pas constamment l'écran. Au lieu de cela, vous faites un crochet pour votre contrôle (comme l'espionnage pour les messages Windows que le contrôle reçoit). Ensuite, vous essayez d'apprendre quand votre contrôle est censé se redessiner, et faire l'interrogation à l'écran seulement dans ces scénarios.

Plus:

  • utilisation CPU significativement plus faible
  • de bande passante réseau encore acceptable

Contre:

  • La mise en œuvre se complique. Des choses comme l'injection de crochets, etc.
  • Puisqu'il est basé sur une certaine heuristique - vous n'êtes pas garanti (en général) pour couvrir tous les scénarios possibles. Dans certaines circonstances, vous pourriez manquer les changements. Accrocher au niveau inférieur: intercepter les appels aux fonctions de dessin.

(4) Comme il y a énormément de telles fonctions dans le mode utilisateur - la seule possibilité réaliste de le faire est dans le mode kernel.

Vous pouvez écrire un pilote vidéo virtuel (soit un pilote vidéo "miroir", soit accrocher le pilote existant) pour recevoir tous les dessins dans le système. Ensuite, chaque fois que vous recevez une demande de dessin sur la zone spécifique, vous saurez qu'il a été modifié.

Plus:

  • Une utilisation plus faible du processeur.
  • 100% garantie pour intercepter tous les dessins, sans heuristiques
  • Un peu plus propre - pas besoin d'injecter des crochets dans les applications/contrôle

Moins:

  • Il est un développement du pilote ! À moins d'en avoir l'expérience, c'est un vrai cauchemar.
  • Installation plus complexe. Besoin de droits d'administrateur, le plus probablement besoin de redémarrer.
  • encore la charge du processeur et la bande passante considérable

(5) en cours avec le développement du pilote. Tant que vous savez quelles fonctions de dessin sont appelées, vous pouvez changer de stratégie maintenant. Au lieu de «se souvenir» des zones sales et d'interroger l'écran, vous pouvez simplement «vous souvenir» de la fonction de dessin invoquée avec tous les paramètres, puis la «répéter» du côté de l'hôte.

Par conséquent, vous n'avez pas à interroger l'écran du tout. Vous travaillez dans une méthode "vectorisée" (par opposition à "raster").

Ceci est cependant beaucoup plus complexe à mettre en œuvre. Certaines fonctions de dessin prennent comme paramètres d'autres bitmaps, qui à leur tour sont dessinés en utilisant d'autres fonctions de dessin et ainsi de suite. Vous devrez espionner les bitmaps aussi bien que l'écran.

Plus:

  • Zéro charge CPU
  • meilleur trafic réseau possible
  • Garantis toujours travailler

Moins:

  • Il est un développement du pilote à son meilleur! Des mois de développement sont garantis
  • Nécessite une programmation de pointe, une compréhension approfondie du dessin 2D
  • Besoin d'écrire le code à l'hôte qui va "dessiner" toutes les commandes "Enregistrées".
+0

Merci pour votre réponse. Pour ma tâche, la 3ème méthode va s'approcher (espionnage des messages Windows). Je connais wm_paint, mais ce n'est pas suffisant. Pouvez-vous donner plus de commentaires de cette façon? – Schnider

+0

'WM_PAINT' ne suffit pas, car le contrôle peut se dessiner sur place, (il va juste' GetDC' et se dessiner). Vous devriez également regarder des cas particuliers avec 'WM_COMMAND'. Parfois, les messages de souris doivent également être pris en compte. – valdo

+0

C'est juste que j'ai essayé tous les scénarios décrits. Et, je dois dire, dans le "cas général" (contrôle inconnu ou application) - il ne fonctionnera pas de manière fiable. Un contrôle particulier peut cependant être fait de cette manière. – valdo

Questions connexes