在多個監視器上繪制所有窗口 [英] Drawing over all windows on multiple monitors

查看:0
本文介紹了在多個監視器上繪制所有窗口的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我使用以下代碼在單個監視器上繪制:

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屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放