J'ai besoin d'écrire un screencast, et j'ai besoin de détecter quand le contenu de la fenêtre a changé, même si seul le texte a été sélectionné. Cette fenêtre est le contrôle d'un tiers.Comment détecter quand le contenu de la fenêtre a changé
Répondre
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".
- 1. Détecter l'emplacement de l'image/le contenu a changé
- 2. Détecter si le contenu d'un dossier a changé?
- 3. wpf savoir quand le modèle a changé
- 4. Comment détecter le système de fichiers a changé en Java
- 5. Comment afficher correctement la fenêtre transparente cachée lorsque le contenu a changé
- 6. Le contenu iframe a-t-il changé d'événement?
- 7. Comment détecter la classe JavaBean a changé (isDirty)
- 8. Comment identifier quand le DOM a été changé?
- 9. Redimensionner le composant Swing lorsque le contenu a changé dynamiquement
- 10. Comment détecter quand la fenêtre d'action est fermée?
- 11. Comment être notifié lorsque la commande de la fenêtre ou la position sur Mac a changé?
- 12. Comment détecter quand le fichier ics a cliqué
- 13. Détecter lorsque l'utilisateur a changé de mode d'édition dans CKEditor
- 14. Le texte a changé en Javascript
- 15. Comment puis-je détecter que le nombre de lignes d'un NSTableView a changé?
- 16. Comment redimensionner automatiquement un div à la taille de son contenu lorsque le contenu de la div a changé?
- 17. Détecter quand une session d'utilisateurs a exipred
- 18. la fenêtre parent peut-elle être notifiée lorsque le contenu du contrôle de raccourci a changé? (win32)
- 19. comment savoir quand une page web HTTP a changé quand elle est de type html/text?
- 20. Comment détecter si le fond d'écran a changé (Windows XP ou supérieur)?
- 21. Comment détecter que la fenêtre est floue?
- 22. Le marquage/le contenu du marquage a changé depuis la dernière fois que l'utilisateur l'a vu
- 23. textbox a changé d'événement
- 24. Evénement jQuery pour détecter quand la position de l'élément change
- 25. Comment détecter quand la fenêtre est fermée lors de l'utilisation de Show() dans WinForms C#
- 26. Comment puis-je détecter quand l'appel sortant a été accepté?
- 27. Détecter quand la vue modale a été affichée
- 28. Comment détecter quand la hauteur de votre page change?
- 29. Javascript: Détecter quand déplacer une fenêtre de navigateur
- 30. Comment détecter qu'une fenêtre a utilisé son appel "ShowDialog"
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
'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
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