显然,微软已经改变了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) 我目前正在为我的软件创建安装程序。我决定使用 WIX,因为我在 stackoverflow 上读到,虽然它有一个陡峭的学习曲线,但它是创建 .msi 安装程序的最通用的工具。
我正在尝试创建一个非常简单的单屏安装程序,到目前为止我对结果很满意,但有些控件看起来确实过时了。
凹陷的文本编辑与 Windows 10 的外观和感觉并不真正匹配。不过,更让我烦恼的是文件浏览对话框。
我知道我可以更改徽标,但是图标和所有内容看起来就像来自 Windows 98。由于 WIX 似乎是创建 Windows 安装程序的广泛采用的选项,我认为必须有一个解决方案来创建更现代的外观和感觉,但我找不到任何东西。
我必须忍受过时的外观吗?如果是这样,您是否有更好的替代方法来创建 Windows 安装程序(不需要 .msi)?
我的程序正在截取其他应用程序窗口的屏幕截图,以自动执行其中的某些任务。这些窗口可能会隐藏在屏幕外或不时被其他窗口遮挡。
为了减少混乱,我从代码列表中删除了所有错误检查。我正在准备两种类型的屏幕截图
// 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) 我正在创建一个程序,该程序可以使用SetWindowPos()
. 我自己的程序是PROCESS_PER_MONITOR_DPI_AWARE
. 其他程序可以是PROCESS_DPI_UNAWARE
、PROCESS_SYSTEM_DPI_AWARE
或中的任何程序PROCESS_PER_MONITOR_DPI_AWARE
。
因为我自己的程序是PROCESS_PER_MONITOR_DPI_AWARE
,所以我传递给的坐标SetWindowPos()
是物理坐标。我现在想做的是将客户区域的大小调整为逻辑坐标中的特定大小。
我尝试做的是
screenDPI
。windowDPI
。scaleFactor
为screenDPI / windowDPI
.scaleFactor
这在大多数情况下都有效,但是当我使用具有不同显示缩放比例的两个屏幕时,
PROCESS_SYSTEM_DPI_AWARE
当窗口位于辅助屏幕上(辅助屏幕使用 96dpi,而主屏幕使用 120dpi)时,这对于使用 的应用程序会失败。这与窗口框架大小无关,我还不确定为什么它会失败,但是目标x
和y
坐标被放大,以便窗口移到屏幕外。screenDPI
就不再正确了,对吗?我该如何处理这个案子?我知道还有这个功能AdjustWindowRectExForDpi
,但不知何故我无法让它正常工作。dpi
我应该传递给它什么价值?目标屏幕的dpi、目标窗口的dpi还是我自己程序的dpi?另外,该功能仅在Windows 10以上版本可用,那么在旧版Windows客户端上如何处理呢?
我希望得到一些帮助。谢谢!
我刚刚开始使用 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。
假设我有一个组件,它接受一个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
我知道我可以GetProcessDpiAwareness()
用来检查特定进程的dpi意识.但是,这仅从Windows 8.1向上支持.有没有办法在此之前查询进程的dpi意识?我找不到任何有关它的信息.
特别是我想知道该进程是否已运行[x] Disable display scaling on high DPI settings
(至少可以从Windows 7获得).
c++ ×5
winapi ×4
windows ×3
dpi ×2
angular ×1
bitblt ×1
burn ×1
clipping ×1
cmake ×1
dpi-aware ×1
dwm ×1
installation ×1
javascript ×1
makefile ×1
screenshot ×1
typescript ×1
windows-7 ×1
wix ×1