如何通过在桌面上绘图来截取屏幕截图?

时间:2015-12-19 16:03:28

标签: c# pinvoke screenshot

我想制作一个SS应用程序。但我对这个问题有疑问。我希望用户能够选择一个特殊区域来截取屏幕截图。我还希望桌面在用户选择区域时处于活动状态。例如,用户想要拍摄视频特定帧的SS。用户必须能够在播放视频时执行此操作。我已经尝试使用直接在桌面上绘图。但它闪烁得那么厉害。我该如何解决这个问题,还是有另一种方法可以做到?

我的代码:

    [DllImport("User32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("user32.dll")]
    static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);

    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load;
    }

    void Form1_Load(object sender, EventArgs e)
    {
        Start();
    }

    IntPtr handle;
    Graphics grp;

    void Start()
    {
        handle = GetDC(IntPtr.Zero);
        grp = Graphics.FromHdc(handle);
        grp.SmoothingMode = SmoothingMode.HighQuality;
        timer2.Start();
    }
    private void timer2_Tick(object sender, EventArgs e)
    {

        grp.DrawLine(Pens.Red, 0, Cursor.Position.Y, Screen.PrimaryScreen.Bounds.Width, Cursor.Position.Y);
        InvalidateRect(IntPtr.Zero, IntPtr.Zero, false);
    }

1 个答案:

答案 0 :(得分:5)

创建具有半透明(或完全透明)背景的表单,该表单始终在顶部,无边框且与桌面大小相同。在该表单上执行任何屏幕截图矩形选择图形(例如,选定的矩形+指南+放大镜,完全不透明)。当用户进行选择时,隐藏表单并截取屏幕截图。