在多個監視器上繪制所有窗口 [英] Drawing over all windows on multiple monitors
本文介紹了在多個監視器上繪制所有窗口的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我使用以下代碼在單個監視器上繪制:
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);
}
本機情況下,理論上應在任一顯示器上繪制。然而,它只借鑒了主要的。因此,為了解決這個問題,我得到了所有顯示器的DC,并嘗試這樣做。
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);
去想一想,這根本不會顯示在屏幕上。我已經嘗試了CreateDC的各種重載,以及搜索SO和其他資源,但我被難住了。
一旦這個問題得到解決,有誰知道如何通過使用SHCHangeNotify刷新桌面來消除閃爍?我只畫了兩條線,它像瘋了一樣閃爍。)
推薦答案
這不是您問題的答案,但如果您沒有問題,我會重新評論嘗試使用wpf來解決這個問題。我已經嘗試過其他類型的桌面交互,比如透明和WPF,與GDI替代方案相比,WPF速度快得驚人。
您可以放置您的WPF應用程序并調整其大小,以適應您需要在其上繪制的所有區域。然后將其設置為透明,并確保其點擊(我認為這是100%透明的默認設置)。這樣,只要你在這個大的WPF畫布/表單上沒有任何東西,所有的鼠標事件都會點擊進入桌面。那就開始在上面畫畫吧。(我喜歡它,因為它很容易為線條和圖像添加效果)。保證不閃爍。
或者,您也可以在普通Windows窗體上使用相同的方案。
這樣您就不必求助于GDI來完成您的工作。
我認為您現在能夠做到無閃爍的唯一方法是掛鉤到桌面WM_PAINT上的窗口消息,并在那里進行工作。
這篇關于在多個監視器上繪制所有窗口的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文