C# 自定义屏幕保护程序捕获桌面返回纯色

问题描述 投票:0回答:1

我正在致力于用 C# 为 .NET 8.0 创建屏幕保护程序。我目前正在尝试做一些类似于气泡屏幕保护程序如何截取桌面并将其用作背景的操作。

一切正常,预览模式有效,并且以

.exe
方式运行屏幕保护程序也有效。当屏幕保护程序在空闲后实际运行时会出现此问题。 Windows 在运行屏幕保护程序之前显示纯色,因此截图就可以实现这一点。

节目课

static void ShowScreenSaver()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    foreach (Screen screen in Screen.AllScreens)
    {
        ScreenSaverForm screensaver = new(screen);
        screensaver.Show();
        screensaver.Refresh();
    }
}

ScreenSaverForm
班级

public Bitmap screenBitmap;

public ScreenSaverForm(Screen screen)
{
    screenBitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height, PixelFormat.Format24bppRgb);

    Graphics captureGraphics = Graphics.FromImage(screenBitmap);

    captureGraphics.CopyFromScreen(screen.Bounds.Location, Point.Empty, screen.Bounds.Size);
    captureGraphics.Dispose();

    InitializeComponent();
    StartPosition = FormStartPosition.Manual;
    Bounds = screen.Bounds;

    timer1.Start();

    DoubleBuffered = true;

    Paint += ScreenSaverForm_Paint;
}

我尝试了透明窗口,但纯色仅出现在其下方。如果有人对气泡屏幕保护程序如何实现它或任何其他替代方式在纯色下进行屏幕截图有任何见解,我们将不胜感激!

c# windows winforms .net-8.0 screensaver
1个回答
0
投票

当窗口闲置时,它会创建单独的桌面,在其上绘制屏幕保护程序。这是安全测量。

    private const uint DESKTOP_READOBJECTS = 0x0001;

    [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    private static extern IntPtr OpenDesktop(string lpszDesktop, int dwFlags, 
            bool fInherit, uint dwDesiredAccess);

[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle)

IntPtr hdt = OpenDesktop("Default", 0, false, AccessUnlocked);
IntPtr hWndDesktop = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);

从这里,您可以创建图形并读取该窗口。

© www.soinside.com 2019 - 2024. All rights reserved.