Comment dessiner sur le bureau en C#?
Je veux dessiner directement sur le bureau en C#. De cherchant un peu, j'ai fini à l'aide d'un objet Graphique à partir du Bureau HDC (null). Ensuite, j'ai peint normalement à l'aide de cet objet Graphique.
Le problème est que mes formes perdu quand une partie de l'écran est redessiné. J'ai essayé avec une boucle While, mais il finit en dessin aussi vite que la demande, ce qui n'est pas le taux de mise à jour de l'ordinateur de bureau.
Normalement, j'aurais besoin de mettre mon code de dessin dans un "OnPaint de l'événement", mais une telle chose n'existe pas pour le bureau.
Comment aurais-je le faire?
Exemple de code: https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c
OriginalL'auteur Lazlo | 2010-05-25
Vous devez vous connecter pour publier un commentaire.
Lorsque vous dessinez pour HDC(NULL) vous dessinez à l'écran, dans une exploitation non maîtrisée. Comme vous l'avez découvert, dès que windows actualise la partie de l'écran, vos modifications sont écrasés.
Il ya un couple d'options, selon ce que vous voulez atteindre:
non-fenêtre rectangulaire. (Utilisation
SetWindowRgn pour rendre une fenêtre
non rectangulaire.) Vous pouvez profiter de cette enfant de la fenêtre du bureau.
injecter une DLL dans le
Explorer.exe processus.
OriginalL'auteur mdma
J'ai posté deux solutions pour une obligation similaire ici
En gros, vous avez deux options.
1 - procurez-vous un objet graphique pour le bureau et de commencer à dessiner. Le problème est que si vous avez besoin pour commencer à nettoyer ce que vous avez dessiné précédemment etc.
2 - La deuxième option que je fournis dans le lien ci-dessus est de créer un transparent en haut de la fenêtre et de faire tout votre dessin dans la fenêtre. En fait cela fournit une superposition transparente pour le bureau, vous pouvez vous inspirer. Un inconvénient possible, comme je le mentionne dans l'original de la réplique, c'est que les autres fenêtres qui sont également de plus en haut et sont créés après le démarrage de l'application va obscurcir votre plus haut de la fenêtre. Ce problème peut être résolu si c'est un problème.
Pour l'option 2, la forme de transparence est aussi simple que d'utiliser une clé de la transparence, ce qui permet de clics de souris etc. à l'automne par le biais de la sous-bureau.
On devrait passer GetDesktopWindow() pour les Graphismes.FromHwnd() car IntPtr.Zéro est un détail d'implémentation qui peut changer, et sera certainement PAS de travail pour le multi-bureau ou multi-session postes de travail.
OriginalL'auteur Chris Taylor
Pour obtenir un
OnPaint
pour le bureau, vous auriez besoin d'une classe de la fenêtre du bureau et de l'utilisation de votre dessin logique lorsqu'il reçoit uneWM_PAINT/WM_ERASEBKGND
message.Que le fil que vous avez lié à dit, vous ne pouvez intercepter les messages envoyés à une fenêtre d'un processus externe à l'aide d'un crochet (
SetWindowsHookEx
à partir d'une DLL).Comme mentionné précédemment, une fenêtre transparente est une autre façon de faire, ou (en fonction de la fréquence de mise à jour) de copier, de dessin et de réglage temporaire de papier peint (comme bginfo n').
OriginalL'auteur Alex K.
C'est difficile de le faire correctement.
Il sera beaucoup plus facile et plus fiable, pour faire de votre propre formulaire sans bordure à la place.
OriginalL'auteur SLaks