【问题标题】:Issue capturing a bitmap using window handle in windows 8在 Windows 8 中使用窗口句柄捕获位图的问题
【发布时间】:2015-04-16 10:17:03
【问题描述】:

这是我在 Windows 7 上运行良好的代码:

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

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

        public static Bitmap CaptureWindow(IntPtr hWnd) {
            Rectangle rctForm = Rectangle.Empty;

            using (Graphics grfx = Graphics.FromHdc(DLLImport.GetWindowDC(hWnd))) {
                rctForm = Rectangle.Round(grfx.VisibleClipBounds);
            }

            Bitmap pImage = new Bitmap(rctForm.Width, rctForm.Height);
            Graphics graphics = Graphics.FromImage(pImage);
            IntPtr hDC = graphics.GetHdc();

            try {
                DLLImport.PrintWindow(hWnd, hDC, (uint)0);
            } finally {
                graphics.ReleaseHdc(hDC);
            }

            return pImage;
        }

我遇到的问题是,在 Windows 8 上,它似乎生成了一个完全空白的位图(尽管尺寸是正确的)。有谁知道会发生什么?

【问题讨论】:

    标签: c# windows winapi windows-8 user32


    【解决方案1】:

    为了它,我会尝试传递 PW_PRINTCLIENT 并看看你是否得到不同的结果,因为目标窗口处理不同。然而:

    请记住,这个 API 并不神奇(稍后我会指出神奇的 API)。它并没有真正抓取窗口的内容,它使用 WM_PRINT 和一些魔法来抓取可见内容:

    “拥有 hWnd 引用的窗口的应用程序处理 PrintWindow 调用并在 hdcBlt 引用的设备上下文中呈现图像。应用程序接收 WM_PRINT 消息,或者,如果指定了 PW_PRINTCLIENT 标志,则WM_PRINTCLIENT 消息。有关详细信息,请参阅 WM_PRINT 和 WM_PRINTCLIENT。"

    您可以通过将名为“Windows 7 任务管理器”(我还没有使用 8)的漂亮、优雅的应用程序部分遮挡窗口,设置为“始终在顶部”来确认“非魔法”部分,执行一个 ALT-PRTSCRN,并在屏幕抓取中看到任务管理器仍在您的窗口顶部。

    换句话说,它最终取决于应用程序在一定程度上遵守和正常运行。这就是为什么在过去我已经完成了“抓住整个屏幕并删除我想要的部分”的方法。

    我没有看到任何表明它在 Windows 8 上有所不同,但如果您是 Vista 或更高版本,则有一个桌面窗口管理器 API 允许您抓取应用程序窗口(我想这就是任务栏缩略图的方式被创建)。您可以在这里查看源代码,我认为这将是最可靠的方法:

    https://code.google.com/p/zscreen/source/browse/trunk/ZScreenLib/Global/Capture.cs?r=1523

    如果您需要使用 Vista 之前的版本,我猜您可能会得到两个代码路径。

    如果您严格使用 Windows 8 或更高版本,那么“桌面复制 API”可能对您很方便。

    【讨论】:

    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多