首页 > 解决方案 > 屏幕截图程序过载 RAM

问题描述

所以我对 C# 比较陌生,我想骑一个应用程序来显示你悬停的像素的颜色,但是这个代码似乎是一个大问题。非常感谢代码的帮助:

private void timer1_Tick(object sender, EventArgs e)
{
    b = null;
    b = Screenshot();
    Color color = b.GetPixel(Cursor.Position.X, Cursor.Position.Y);
    label1.Text = color.Name;
    label2.Text = Cursor.Position.Y.ToString() + Cursor.Position.X.ToString();
}

private Bitmap Screenshot()
{
    Bitmap Screen = new Bitmap(SystemInformation.VirtualScreen.Width,SystemInformation.VirtualScreen.Height);
    Graphics g = Graphics.FromImage(Screen);
    g.CopyFromScreen(SystemInformation.VirtualScreen.X,SystemInformation.VirtualScreen.Y, 0, 0, Screen.Size);
    return Screen;
}

标签: c#

解决方案


您既不需要计时器,也不需要复制整个屏幕。只需像这样添加一个 MouseMove 处理程序:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    using (var bitmap = new Bitmap(1, 1))
    {
        var graphics = Graphics.FromImage(bitmap);
        var position = PointToScreen(e.Location);
        graphics.CopyFromScreen(position.X, position.Y, 0, 0, new Size(1, 1));
        var color = bitmap.GetPixel(0, 0);

        label1.Text = color.ToString();
    }
}

或重用位图:

private readonly Bitmap bitmap = new Bitmap(1, 1);

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    var graphics = Graphics.FromImage(bitmap);
    var position = PointToScreen(e.Location);
    graphics.CopyFromScreen(position.X, position.Y, 0, 0, new Size(1, 1));
    var color = bitmap.GetPixel(0, 0);

    label1.Text = color.ToString();
}

推荐阅读