相关疑难解决方法(0)

Windows上最快的屏幕捕获方法

我想为Windows平台编写一个截屏程序,但我不确定如何捕获屏幕.我所知道的唯一方法就是使用GDI,但我很好奇是否还有其他方法可以解决这个问题,如果有的话,会产生最少的开销?速度是一个优先事项.

屏幕录像程序将用于录制游戏镜头,但是,如果这确实缩小了选项范围,我仍然可以接受任何其他超出此范围的建议.毕竟知识还不错.

编辑:我遇到过这篇文章:捕获屏幕的各种方法.它向我介绍了Windows Media API的实现方式以及DirectX的实现方式.它在结论中提到,禁用硬件加速可以极大地提高捕获应用程序的性能.我很好奇为什么会这样.任何人都可以为我填补遗失的空白吗?

编辑:我读过像Camtasia这样的截屏程序使用他们自己的捕获驱动程序.有人能给我一个深入的解释它是如何工作的,以及为什么它更快?我可能还需要有关实现类似内容的指导,但我确信无论如何都有现有的文档.

此外,我现在知道FRAPS如何记录屏幕.它挂钩底层图形API以从后台缓冲区读取.根据我的理解,这比从前端缓冲区读取更快,因为您是从系统RAM而不是视频RAM读取的.你可以在这里阅读这篇文章.

c c++ windows

149
推荐指数
11
解决办法
16万
查看次数

如何使用"工具提示"捕获屏幕?

我正在使用GDI捕获屏幕,我注意到屏幕截图中没有包含"工具提示".这是我的基本代码:

HDC hdcDesk = GetDC(0);

HDC hdcMem = CreateCompatibleDC(hdcDesk);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080);
SelectObject(hdcMem, hbmMem);

StretchBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, 1920, 1080, SRCCOPY);

// Now save the bitmap...
Run Code Online (Sandbox Code Playgroud)

可以修复,还是应该使用其他方法捕获屏幕(GDI除外)?


编辑:

这是我拍摄的不显示工具提示的屏幕截图.

在此输入图像描述

c c++ winapi gdi

28
推荐指数
2
解决办法
1341
查看次数

BitBlt屏幕截图无法在Windows 10上运行

我正在使用此代码在后台捕获进程窗口:

IntPtr = Process.GetProcessByName("memu")[0].MainWindowHandle;
RECT rc;
GetClientRect(hwnd, out rc);

IntPtr hdcFrom = GetDC(hwnd);
IntPtr hdcTo = CreateCompatibleDC(hdcFrom);

int Width = rc.right;
int Height = rc.bottom;

Bitmap bmp = null;

IntPtr hBitmap = CreateCompatibleBitmap(hdcFrom, Width, Height);
if (hBitmap != IntPtr.Zero) {
   IntPtr hLocalBitmap = SelectObject(hdcTo, hBitmap);

   BitBlt(hdcTo, 0, 0, Width, Height, hdcFrom, 0, 0, CopyPixelOperation.SourceCopy);
   SelectObject(hdcTo, hLocalBitmap);

   DeleteDC(hdcTo);
   ReleaseDC(hwnd, hdcFrom);

   bmp = Image.FromHbitmap(hBitmap);
   DeleteObject(hBitmap);
   return bmp;
}
Run Code Online (Sandbox Code Playgroud)

这段代码捕获了一个名为MEmu的Android模拟器,它使用DirectX来呈现内容.但是这个代码在Windows 10更新到16299版之后停止工作(之前它正常工作),它仍然在启用了Aero模式的Windows 7上运行.

当我在Windows 10 Pro v16299.X中使用此方法时,它只返回一个白色图像,或者它返回模拟器"加载屏幕",而不是正在运行的内容.在Windows 7上,如果我删除Aero模式,它将采取相同的行动,捕获"加载屏幕",因此看起来像新的Windows 10专业版更新中的透明度工作方式.

我已经尝试了一切,尝试安装一些模块以强制Aero Mode在Windows 10上工作,尝试使用PrintWindow在后台捕获屏幕,但仍然是相同的.

有什么想法会发生什么?还是可能的解决方案?或者在最后一个可能破坏该代码的Windows 10 …

c# windows windows-10

24
推荐指数
1
解决办法
1558
查看次数

是否可以捕获带有Windows 7 DWM缩略图的窗口?

我开始相信你对Windows API无能为力.

我有两个窗户.其中有一个DWM缩略图.我想要做的是,我希望能够用缩略图捕捉窗口的屏幕到另一个.当我这样做时,使用bitblt,除了缩略图之外,所有内容都被复制.它只是在位图中没有.

那么DWM渲染如何工作呢?我的意思是,如果DWM将缩略图直接渲染到已注册窗口的DC上,那么我的方法应该有效.我糊涂了.

谢谢一堆.

winapi dwm windows-7

5
推荐指数
1
解决办法
3902
查看次数

DirectX 屏幕捕获和输出为视频

我正在做桌面屏幕截图,并希望输出是一个视频文件。目前我有代码从这里输出 png 图像。我稍微修改了代码以将输出更改为 JPEG 文件,然后使用 openCV 3.0.0 将其转换为 avi 视频输出。我需要 JPEG 文件作为输出的原因是因为我在 Windows 8.1 上运行,而 OpenCV VideoWriter::fourcc('M', 'J', 'P', 'G') 是唯一对我有用的选项。

PNG 图像的输出效果很好,但不是 JPEG。图像上有垂直线,生成 JPEG 输出的时间比 PNG 长得多。

我在这里有两个选择:

  1. 改进 JPEG 文件的输出以更快地工作并具有清晰的图像。

  2. 摆脱 OpenCV 3.0.0 接受 PNG 文件输入并能够输出视频文件的问题。(最好是 AVI/MP4 文件格式)

任何一种解决方案都适合我。请帮忙。谢谢你。

我的代码:

#include "stdafx.h"
#include <Wincodec.h>             // we use WIC for saving images
#include <d3d9.h>                 // DirectX 9 header
#include <opencv\cv.h>
#include <opencv\cxcore.hpp>
#include <opencv2\highgui\highgui.hpp>
#pragma comment(lib, "d3d9.lib")  // link to DirectX 9 library

using namespace cv;

#define …
Run Code Online (Sandbox Code Playgroud)

c++ directx video opencv image

4
推荐指数
1
解决办法
5504
查看次数

标签 统计

c++ ×3

c ×2

winapi ×2

windows ×2

c# ×1

directx ×1

dwm ×1

gdi ×1

image ×1

opencv ×1

video ×1

windows-10 ×1

windows-7 ×1