小编Joh*_*ker的帖子

在Windows 1809中操作系统/可见剪辑区域

显然,微软已经改变了2018年末发布的Windows更新1809的剪辑方式.在更新之前,GetClipBox()返回窗口的完整客户端矩形,即使它(部分)在屏幕外.更新后,相同的函数返回一个剪切的矩形,仅包含仍在屏幕上的部分.这导致不为屏幕外区域更新设备上下文内容,这阻止我从这些窗口截取屏幕截图.

问题是:我可以以某种方式操纵裁剪区域吗?

我研究了一下,似乎最终剪辑区域受窗口区域,更新矩形和系统区域的影响 - 据我所知,"全局剪辑区域".我用GetWindowRgn()和检查了窗口区域,并且GetRgnBox()都返回了Windows 1809和旧版本的相同值.GetUpdateRect()也返回完整的客户端矩形,因此也不是问题.我也试图挂钩BeginPaint()方法,看看是否做了更改PAINTSTRUCT.rcPaint,没有成功.

所以我剩下的就是尝试调整系统区域,或者有时称为可见区域.但是,我不知道是否以及如何做到这一点.MSDN表明它不是,但我想也许有人确实想要一个解决方案!?

编辑:为了使这更清楚,我不认为裁剪是由应用程序本身完成的,因为相同应用程序版本的屏幕截图在Windows 1809之前工作,并且不适用于更新的Windows版本.相反,Windows本身似乎会剪切任何屏幕外表面.

EDIT2:这是获取屏幕截图的最小工作代码示例.

// Get the client size.
RECT crect;
GetClientRect(hwnd, &crect);
int width = crect.right - crect.left;
int height = crect.bottom - crect.top;

// Create DC and Bitmap.
HDC windowDC = GetDC(hwnd);
HDC memoryDC = CreateCompatibleDC(windowDC);
BITMAPINFO bitmapInfo;
ZeroMemory(&bitmapInfo, sizeof(BITMAPINFO));
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biWidth = width;
bitmapInfo.bmiHeader.biHeight = -height;
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 32; …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi clipping

25
推荐指数
1
解决办法
551
查看次数

具有现代外观和感觉的 WIX 安装程序

我目前正在为我的软件创建安装程序。我决定使用 WIX,因为我在 stackoverflow 上读到,虽然它有一个陡峭的学习曲线,但它是创建 .msi 安装程序的最通用的工具。

我正在尝试创建一个非常简单的单屏安装程序,到目前为止我对结果很满意,但有些控件看起来确实过时了。

在此处输入图片说明

凹陷的文本编辑与 Windows 10 的外观和感觉并不真正匹配。不过,更让我烦恼的是文件浏览对话框。

在此处输入图片说明

我知道我可以更改徽标,但是图标和所有内容看起来就像来自 Windows 98。由于 WIX 似乎是创建 Windows 安装程序的广泛采用的选项,我认为必须有一个解决方案来创建更现代的外观和感觉,但我找不到任何东西。

我必须忍受过时的外观吗?如果是这样,您是否有更好的替代方法来创建 Windows 安装程序(不需要 .msi)?

windows installation windows-installer wix burn

6
推荐指数
1
解决办法
5024
查看次数

隐藏窗口的PrintWindow和BitBlt

我的程序正在截取其他应用程序窗口的屏幕截图,以自动执行其中的某些任务。这些窗口可能会隐藏在屏幕外或不时被其他窗口遮挡。

为了减少混乱,我从代码列表中删除了所有错误检查。我正在准备两种类型的屏幕截图

// Get size of the target window.
RECT clientRect;
GetClientRect(hwnd, &clientRect);
int width = clientRect.right - clientRect.left;
int height = clientRect.bottom - clientRect.top;
// Create a memory device context.
HDC windowDC = GetDC(hwnd);
HDC memoryDC = CreateCompatibleDC(windowDC);
// Create a bitmap for rendering.
BITMAPINFO bitmapInfo;
ZeroMemory(&bitmapInfo, sizeof(BITMAPINFO));
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biWidth = width;
bitmapInfo.bmiHeader.biHeight = -height;
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 32;
bitmapInfo.bmiHeader.biCompression = BI_RGB;
bitmapInfo.bmiHeader.biSizeImage = width * height * 4;
RGBQUAD* buffer;
HBITMAP bitmap = CreateDIBSection(windowDC, …
Run Code Online (Sandbox Code Playgroud)

c++ winapi screenshot dwm bitblt

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

SetWindowPos() 跨进程 DPI 感知

我正在创建一个程序,该程序可以使用SetWindowPos(). 我自己的程序是PROCESS_PER_MONITOR_DPI_AWARE. 其他程序可以是PROCESS_DPI_UNAWAREPROCESS_SYSTEM_DPI_AWARE或中的任何程序PROCESS_PER_MONITOR_DPI_AWARE

因为我自己的程序是PROCESS_PER_MONITOR_DPI_AWARE,所以我传递给的坐标SetWindowPos()是物理坐标。我现在想做的是将客户区域的大小调整为逻辑坐标中的特定大小。

我尝试做的是

  1. 获取窗口所在显示器的 DPI,如下所示screenDPI
  2. 获取目标窗口的 DPI 为windowDPI
  3. 获取scaleFactorscreenDPI / windowDPI.
  4. 将所需的客户区域大小缩放scaleFactor
  5. 通过从窗口矩形大小中减去当前客户端矩形大小来计算窗口框架的额外大小。

这在大多数情况下都有效,但是当我使用具有不同显示缩放比例的两个屏幕时,

  • 如果我将窗口从一个屏幕移动到下一个屏幕,则窗口框架尺寸的计算将关闭。
  • PROCESS_SYSTEM_DPI_AWARE当窗口位于辅助屏幕上(辅助屏幕使用 96dpi,而主屏幕使用 120dpi)时,这对于使用 的应用程序会失败。这与窗口框架大小无关,我还不确定为什么它会失败,但是目标xy坐标被放大,以便窗口移到屏幕外。
  • 如果由于调整大小,窗口中心改变了屏幕,会发生什么情况?那么意志screenDPI就不再正确了,对吗?我该如何处理这个案子?

我知道还有这个功能AdjustWindowRectExForDpi,但不知何故我无法让它正常工作。dpi我应该传递给它什么价值?目标屏幕的dpi、目标窗口的dpi还是我自己程序的dpi?另外,该功能仅在Windows 10以上版本可用,那么在旧版Windows客户端上如何处理呢?

我希望得到一些帮助。谢谢!

c++ windows winapi dpi

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

cmake 使用 *.cpp 规则创建 Makefile

我刚刚开始使用 cmake,我已经阅读了一些教程并得到了基本的工作。

然而,目前我的 CMakesList.txt 生成一个 Makefile,其中每个 .cpp 都明确命名。这意味着,每当我向项目添加新的 .cpp 时,我都需要重新运行 cmake,然后才能进行 make。虽然这不是什么大问题,但仍然有点烦人。

由于Makefiles可以做类似的事情SOURCES=*.cpp,我想可能有一种方法可以告诉cmake用这样的规则生成Makefile!?

我知道我能做到

cmake_minimum_required(VERSION 2.8)
file(GLOB SRC
    "*.h"
    "*.cpp"
)
add_executable(main ${SRC})
Run Code Online (Sandbox Code Playgroud)

但我仍然必须重新运行 cmake。

c++ makefile cmake

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

如何按值将对象传递给 Angular2+ 组件

假设我有一个组件,它接受一个Foo实例并显示一个表单来编辑它。

export class ChildComponent implements OnInit {
  @Input() foo : Foo;
  @Output() onChange : EventEmitter<Foo> = new EvenEmitter<Foo>();

  constructor() {
  }

  ngOnInit() {
  }
}
Run Code Online (Sandbox Code Playgroud)

我把它嵌套ChildComponent在一个ParentComponent.

<div id="parent">
  <app-child-component [foo]="parentFoo"></app-child-component>
</div>
Run Code Online (Sandbox Code Playgroud)

现在,即使我在这里使用了单向绑定,由于foo是一个对象并因此通过引用传递,对它所做的任何更改ChildComponent也反映在ParentComponent.

我怎样才能防止这种情况?有没有办法按值传递?任何最佳实践?

javascript parameter-passing pass-by-value typescript angular

2
推荐指数
1
解决办法
3148
查看次数

Windows 8之前的GetProcessDpiAwareness()

我知道我可以GetProcessDpiAwareness()用来检查特定进程的dpi意识.但是,这仅从Windows 8.1向上支持.有没有办法在此之前查询进程的dpi意识?我找不到任何有关它的信息.

特别是我想知道该进程是否已运行[x] Disable display scaling on high DPI settings(至少可以从Windows 7获得).

c++ winapi dpi windows-7 dpi-aware

2
推荐指数
1
解决办法
148
查看次数