2009-03-30 7 views
4

J'utilise le code suivant pour dessiner sur un seul moniteur:Dessin sur toutes les fenêtres sur plusieurs moniteurs

Point cursorLocation; 
NativeMethods.GetCursorPos(out cursorLocation); 
Screen screen = Screen.FromPoint(cursorLocation); 

Point h1 = new Point(screen.Bounds.Left, cursorLocation.Y); 
Point h2 = new Point(screen.Bounds.Right, cursorLocation.Y); 
Point v1 = new Point(cursorLocation.X, screen.Bounds.Top); 
Point v2 = new Point(cursorLocation.X, screen.Bounds.Bottom); 

using (Graphics graphics = Graphics.FromHwnd(NativeMethods.GetDesktopWindow())) { 
    NativeMethods.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero); 
    graphics.DrawLine(Pens.Red, h1, h2); 
    graphics.DrawLine(Pens.Red, v1, v2); 
} 

Natively, ce devrait théoriquement tirage de chaque moniteur. Cependant, il ne s'appuie que sur le primaire. Donc, pour résoudre ce problème, je reçois le DC de tous les écrans et j'essaie de le faire de cette façon.

IntPtr hdc = NativeMethods.CreateDC("DISPLAY", IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 
Graphics graphics = Graphics.FromHdc(hdc); 
graphics.DrawLine(Pens.Red, h1, h2); 
graphics.DrawLine(Pens.Red, v1, v2); 
graphics.Dispose(); 
NativeMethods.ReleaseDC(IntPtr.Zero, hdc); 

Go figure, cela ne même pas dessiner à l'écran du tout. J'ai essayé différentes surcharges pour CreateDC, ainsi que la recherche de SO et d'autres ressources et je suis perplexe.


fois ce problème résolu, quelqu'un sait comment se débarrasser de scintillement en actualisant le bureau en utilisant SHChangeNotify? Je dessine seulement deux lignes et ça scintille comme un fou ..)

Répondre

3

Ceci n'est pas une réponse à votre question mais si vous n'y voyez pas de problème, je recommanderais d'essayer d'utiliser WPF pour résoudre ce problème. J'ai joué avec d'autres types d'interactions de bureau comme la transparence et WPF est rapide comme l'alternative GDI.

Vous placez votre application wpf et la redimensionnez pour l'adapter à toute la zone sur laquelle vous devez peindre. Ensuite, définissez-le à transparent, et assurez-vous de son clic (je pense que c'est par défaut sur 100% de transparence). De cette façon, tant que vous n'avez rien sur ce grand canevas/formulaire WPF, tous les événements de souris cliqueront sur le bureau.

Ensuite, commencez simplement à peindre dessus. (je l'ai aimé car il était très facile d'ajouter des effets aux lignes et aux images). Garanti sans scintillement.

Vous pouvez également utiliser le même schéma sur Windows Forms normal à la place.

De cette façon, vous n'aurez pas à vous tourner vers GDI pour faire votre travail. Je pense que la seule façon de faire ce scintillement sans flou maintenant serait de vous connecter à la fenêtre de messagerie sur les bureaux WM_PAINT et d'y faire votre travail.

-1

Ne peux pas aider sur la première partie. Je suppose que vous dessinez les lignes dans l'événement Paint. Utilisez un double tampon pour vous débarrasser du scintillement.

1

Malheureusement, ni réponse est d'aucune aide pour les raisons suivantes:

Je suis limité à Windows Forms, car cela est un cadre de base construit pour WF. J'ai essayé le truc TransparencyKey/Form, ça scintille toujours trop.

J'ai sérieusement essayé près de dix méthodes différentes, et même mes résultats de recherche dans Google pour DirectX/Direct3D, C# Desktop Hooks, et d'autres m'ont apporté en vain. Tout ce que j'essaie de faire est de dessiner un réticule qui couvre l'ensemble du bureau, 1px x 1px .. sûrement quelqu'un doit avoir une sorte d'exemple de la façon de le faire sans scintillement et de bonnes performances:? D3D, DX, GDI ou autre? : \

0

cela a fonctionné pour moi. J'ai utilisé EnumDisplayDevices pour récupérer les noms.

[DllImport("gdi32.dll")] 
public static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData); 

var hdc = CreateDC(@"\\.\DISPLAY1", "", "", IntPtr.Zero); 
Graphics graphics = Graphics.FromHdc(hdc); 
var pt = Cursor.Position; 
g.DrawEllipse(Pens.BlueViolet, pt.X - 100, pt.Y - 100, 200, 200); 

plus d'info ici: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145179(v=vs.85).aspx

+0

Votre code ne compile pas-est - votre objet graphique est nommé "graphiques", mais plus tard, vous l'utiliser comme "g". – BrainSlugs83

+0

Graphics.FromHwnd (hdc) déclenche une exception OutOfMemoryException pour moi - à la fois pour un hdc créé à partir de "\\. DISPLAY1", et sur tous les dcs non-zéro créés par des chaînes renvoyées par EnumDisplayDevices ... – BrainSlugs83

Questions connexes