【发布时间】:2016-01-04 00:14:54
【问题描述】:
我的任务是重新创建具有类似于 Windows 截图工具的功能的应用程序。其中之一是捕获当前处于活动状态的窗口的屏幕截图,这就是导致我出现问题的原因。一切都几乎完美无缺,但是应用程序的“剪辑”比实际应用程序大几个像素,这是因为它的窗口比我设置的要小一些。
这是我测试的主窗口的 CreateWindow 调用:
hwnd = CreateWindow(TEXT("Klasa okien"), TEXT("Screenshot"), WS_OVERLAPPEDWINDOW,
10, 10, 350, 400, NULL, NULL, hInstance, NULL);
然后收集有关该窗口大小的信息并继续执行“截图”功能的过程:
RECT okno;
HWND aktywne = GetForegroundWindow();
GetWindowRect(aktywne, &okno);
CaptureScreen(okno.left, okno.top, okno.right-okno.left, okno.bottom-okno.top);
最后是采用这些片段的函数的一部分:
void CaptureScreen(int x, int y, int width, int height)
{
HDC hDc = CreateCompatibleDC(0);
HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);
SelectObject(hDc, hBmp);
BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY);
Bitmap *p_bmp = Bitmap::FromHBITMAP(hBmp, NULL);
...
正如我所说 - 一切都很好,正在创建的图片实际上是 350x400,但实际窗口的大小似乎是 336x393。我还附上了两张图片 - 完美的一张是由 Windows 工具创建的,另一张是我的。
Result of my tool 350x400 和 Result of Windows' snipping tool 336x393
【问题讨论】:
-
无法测试 atm,但您可能需要查看 this function。
-
BUT actual window's size seems to be 336x393-- 你如何确定这个? -
这是“Windows 10 对没有特殊清单的程序的窗口大小撒谎”这一常见问题的另一种情况吗?
-
@CareyGregory,如果我要启动 Windows 的截图工具并选择“窗口截图”我的应用程序的选项 - 它将创建一个大小为 336x393 的图像。我还附上了这种操作的确切结果。问题是我实际上已经将 350 和 400 作为大小传递给了 CreateWindow() 函数。
-
@andlabs,我不确定。我认为我没有足够的经验来回答你的问题。我不介意我的窗口比我设置的要小一些。我希望能够截取不包括超出窗口范围的区域的屏幕截图。
标签: c++ winapi screenshot