- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的任务是重新创建具有类似于 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
最佳答案
此问题是 Windows 10 特有的,它与 Windows 10 透明边框有关。例如,如果窗口具有调整大小的边框,则左/右/底部的边框约为 7 像素。
如果您正在截屏,那么您可能希望排除透明边框。将 GetWindowRect
替换为:
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc, sizeof(RECT));
//requires at least Windows Vista
与GetWindowRect
相比,从DwmGetWindowAttribute
获取的矩形在左、右、下各小了约7个像素。
#include "Dwmapi.h"
#pragma comment( lib, "Dwmapi.lib" )
...
RECT rc;
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc, sizeof(RECT));
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;
HDC memdc = CreateCompatibleDC(hdc);
HBITMAP bmp = CreateCompatibleBitmap(hdc, w, h);
SelectObject(memdc, bmp);
BitBlt(memdc, 0, 0, w, h, hdc, rc.left, rc.top, CAPTUREBLT | SRCCOPY);
...
其次,不要使用GetDC(0)
(以那种方式),因为它会导致资源泄漏。您必须保存从 GetDC
获得的句柄,稍后再释放它。例如:
HWND desktopWnd = GetDesktopWindow();
HDC hdc = GetDC(desktopWnd);
...
ReleaseDC(desktopWnd, hdc);
编辑:
或使用
HDC hdc = GetDC(0);
...
ReleaseDC(0, hdc);
关于c++ - WinAPI CreateWindow 函数创建小于设置的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583160/
我无法创建自己的名为 CreateWindow 的函数,因为 win32 header 中已经定义了一个函数。只是我什至不能在我自己的命名空间中这样做。真正的问题是什么? MyNamespace::M
我刚刚开始使用 C++ 和创建窗口(在 Windows 上)。我正在使用 CreateWindow 函数,但出现错误 Error 2 error C2664: 'HWND CreateWind
我为我正在编写的 GUI 系统编写了一个主窗口类。在主窗口的构造函数中,它使用 CreateWindow() 函数创建一个 Windows 窗口。该窗口按预期正常显示,但我无法捕获标题栏并将其在屏幕上
在我的 Windows 应用程序中,我正在使用 CreateWindow() 函数创建一个新窗口。注册和创建窗口如下: // Set up the capture window WNDCLASS wc
我想在单击将成为主窗口子项的菜单项时使用 CreateWindow() 创建一个窗口。我知道我可以使用 DialogBox() 或 CreateDialog(),但我想使用 CreateWindow(
我开始使用 C++ 中的 win32 api,当我正要制作一个按钮时,智能感知显示“定义 CreateWindow CreateWindowA”。当我似乎悬停在下方时,它还会显示“错误:预期为 )”。
我正在为 OpenGL 开发一个可移植层(为 Linux 和 Windows 抽象出 glX 和 wgl 的东西)...无论如何,它有一个创建窗口的方法...如果你不传入父级,你会得到一个带框架的真实
您好,我想更改按钮的背景颜色。这是我的按钮代码 hwndTemp = CreateWindow(TEXT("BUTTON"), Str("Settings"), WS_CHILDWINDOW
我对 C++ 相当陌生,并且正在尝试学习在使用 CreateWindow(或 CreateWindowEx)函数为注册类创建的窗口上获取自定义填充颜色的最佳方法。 我编写了一个程序,演示了 3 种方法
您好,我想更改按钮的背景颜色。这是我的按钮代码 hwndTemp = CreateWindow(TEXT("BUTTON"), Str("Settings"), WS_CHILDWINDOW
我在使用 WINAPI 项目时遇到问题。有两个问题,当我用下面的代码启动一个窗口时,高度参数表现得很奇怪。它似乎以 1092 为上限,比我在计算机上需要的位置低 18 个像素。第二个问题是窗口没有边缘
在尝试用 C++ 创建窗口并绘制窗口大小与我设置的大小不匹配的矩形时,我注意到一些非常烦人的事情。 例如,如果我设置 480x240 窗口并尝试通过获取 GetWindowRect(hwnd, &re
我正在使用纯 Win32 API(RegisterClass 和 CreateWindow 函数)创建窗口。如何为窗口指定一种字体而不是系统定义的字体? 最佳答案 当您创建自己的窗口类时,您有责任自己
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Windows Taskbar API Win32: How to hide 3rd party windo
我创建了一个句柄为 handle_parent 的窗口。然后我创建了一个子窗口如下: hwnd_child = CreateWindow(child_class_name, _T(""), WS_CH
我的任务是重新创建具有类似于 Windows 截图工具功能的应用程序。其中之一是捕获当前事件窗口的屏幕截图,这就是导致我出现问题的原因。一切都几乎完美无缺,但是应用程序的“截图”比实际应用程序大几个像
在我的应用程序中,函数 CreateWindow 由于某种原因失败了。 GetLastError 表示错误 1407,根据 MSDN 文档,这是“找不到窗口类”。以下代码显示了如何调用 CreateW
我创建了一个 Electron 应用程序,主要是一个 Web 应用程序,与 Electron 应用程序有少量集成。大多数只是通过带有 loadURL 的 BrowserWindow 加载网站。 但是,
我的程序有一个静态界面,但我不知道制作界面的最佳方法是什么。使用资源文件或使用 WM_CREATE 消息的 CreateWindow 函数? 谢谢 最佳答案 我建议首先从对话框资源开始。然后,如果/当
采用以下代码: # pragma once // Windows specific files #include #include #include #include #include "IO
我是一名优秀的程序员,十分优秀!