繁体   English   中英

我可以在启用了GPU的情况下创建Google Chrome窗口的屏幕截图吗?

Can I create a screenshot of Google Chrome window with gpu enabled

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

基本上,我想做的是创建一个小程序,该程序创建特定窗口的屏幕截图。 现在,我正在使用Windows库中的CaptureWindow。

public class ScreenCapture
{
    [DllImport("user32.dll")]
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);


    public Image CaptureWindow(IntPtr handle)
    {
        // get the DC of the target window
        IntPtr hdcSrc = User32.GetWindowDC(handle);

        // get the size
        User32.RECT windowRect = new User32.RECT();
        User32.GetWindowRect(handle, ref windowRect);
        //int width = windowRect.right - windowRect.left;
        //int height = windowRect.bottom - windowRect.top;
        int width = 800;
        int height = 800;
        // create a device context we can copy to
        IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);

        // create a bitmap we can copy it to,
        // using GetDeviceCaps to get the width/height
        IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);

        // select the bitmap object
        IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);

        // bitblt over
        GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);

        // restore selection
        GDI32.SelectObject(hdcDest, hOld);

        // clean up 
        GDI32.DeleteDC(hdcDest);
        User32.ReleaseDC(handle, hdcSrc);

        // get a .NET image object for it
        Image img = Image.FromHbitmap(hBitmap);

        // free up the Bitmap object
        GDI32.DeleteObject(hBitmap);

        return img;
    }

    private class GDI32
    {
        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
            int nWidth, int nHeight, IntPtr hObjectSource,
            int nXSrc, int nYSrc, CopyPixelOperation rop);

        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
            int nHeight);

        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);

        [DllImport("gdi32.dll")]
        public static extern bool DeleteDC(IntPtr hDC);

        [DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        [DllImport("gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
    }

    /// <summary>
    /// Helper class containing User32 API functions
    /// </summary>

    private class User32
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);

        [DllImport("user32.dll")]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);

        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
    }
}

此功能适用于大多数应用程序,但Google Chrome会显示白色或黑色图像。 当我使用--disable-gpu运行Google Chrome时,它确实可以工作,但这并不是我真正想要的。

问题暂未有回复.您可以查看右边的相关问题.
1 如何改进我的脚本来复制我在 Flameshot 中创建的屏幕截图并将该屏幕截图粘贴到 Google 绘图中?

我下面的基本 Bash 脚本有点慢而且有点不可靠。 你有什么改进的建议吗? 上面的 Bash 脚本允许我使用Flameshot创建屏幕截图,然后在我之前创建的Google 绘图中注释该屏幕截图。 Google 绘图有一些工具(例如箭头和文本框),我喜欢用它们来注释我的屏幕截图,它们位于 Goo ...

5 Google Chrome - 我如何以编程方式启用 chrome://flags 某些模块从禁用模式到启用模式?

如何自动设置 chrome 标志以启用几个模块? 我设计了一个应用程序,它需要在打开 chrome://flags 时启用几个模块,否则整个应用程序将无法工作,对于普通用户来说,做这样小的更改是噩梦。 是否有任何 javascript 或谷歌应用程序引擎或其他方法可以从服务器端脚本或一些插件中使 ...

6 我如何获得谷歌浏览器窗口的所有URL

我目前正在开发扩展程序,但目前我迷失了方向。 基本上,我要它做什么,就是“ OneTab”扩展名的种类。 因此,我的第一个问题是,在将侦听器添加到扩展按钮并执行功能之后,我想获取当前窗口的所有url,并将它们存储在数组中,并在html文件中显示它们。 所以即时通讯使用此: ...

7 我可以创建一个可以在一个窗口中显示多个页面的Chrome扩展程序吗?

我想通过编写应用程序或扩展程序在一个Chrome窗口中显示多个网页。 真正的iframe不会这样做,因为某些网页会禁用iframe的加载,否则content-security-policy指令的问题会阻止其工作。 webview标记不使用浏览器的扩展集或不写入历史记录等,它们似乎只是 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM