我正在使用以下代码在单个显示器上绘制:
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);
}
Run Code Online (Sandbox Code Playgroud)
本身,这应该 从理论上得出任何显示器上。但是,它仅利用初级。所以,为了解决这个问题,我得到了所有显示器的 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);
Run Code Online (Sandbox Code Playgroud)
想想看,这甚至根本没有绘制到屏幕上。我为 CreateDC 尝试了各种重载,并搜索了 SO 和其他资源,但我很难过。
一旦解决了这个问题,有人知道如何通过使用 SHCHangeNotify 刷新桌面来消除闪烁吗?我只画了两条线,它像疯了一样闪烁..)
这不是您问题的答案,但如果您没有问题,我建议尝试使用 WPF 来解决此问题。我尝试过其他类型的桌面交互,例如透明度,与 GDI 替代方案相比,WPF 快如闪电。
您放置您的 wpf 应用程序并调整其大小以适合您需要绘画的所有区域。然后将其设置为透明,并确保其点击率(我认为默认为 100% 透明度)。这样,只要您在这个大的 WPF 画布/表单上没有任何内容,所有鼠标事件都会点击到桌面。
然后开始在上面画画。(我喜欢它,因为它很容易为线条和图像添加效果)。保证不闪烁。
或者,您可以在普通 Windows 窗体上使用相同的方案。
这样您就不必求助于 GDI 来完成您的工作。
我认为,当您现在接近它时,您能够做到这一点的唯一方法是连接到桌面 WM_PAINT 上的窗口消息并在那里完成您的工作。
归档时间: |
|
查看次数: |
3637 次 |
最近记录: |