除SetWindowCompositionAttribute调用外,对窗口进行模糊处理有哪些要求?

问题描述

我有一个处理Windows的dll库:您可以简单地创建窗口,绘制图形等。该库还为您提供了用于Win7和Win10的模糊窗口。

我有两种几乎相同的库构建-一种,没有资源的旧库,另一种具有资源的新库。

我正在Win10中编写一些应用程序,并且一直在使用旧库,但现在决定编译新版本。除了模糊以外,它的工作原理与我说的差不多,但不起作用。这是客户端代码

.html( str )

它完全可以在旧库中使用,而不能在新库中使用-窗口根本不是透明的,因此不会模糊。

详细信息

我正在从库中调用函数,该函数创建窗口,返回hwnd,然后使用alfa设置背景色,然后运行上面的代码。没什么。

在我拥有的源代码中,窗口创建为HWND hwnd; // here stored window created by library function struct ACCENTPOLICY { int na; int nf; int nc; int nA; }; struct WINCOMPATTRDATA { int na; PVOID pd; ULONG ul; }; const HINSTANCE hm = LoadLibrary(L"user32.dll"); if (hm) { typedef BOOL(WINAPI*pSetwindowCompositionAttribute)(HWND,WINCOMPATTRDATA*); const pSetwindowCompositionAttribute SetwindowCompositionAttribute = (pSetwindowCompositionAttribute)GetProcAddress(hm,"SetwindowCompositionAttribute"); if (SetwindowCompositionAttribute) { ACCENTPOLICY policy = { 3,0 }; // and even works 4,155,0 (Acrylic blur) WINCOMPATTRDATA data = { 19,&policy,sizeof(ACCENTPOLICY) }; SetwindowCompositionAttribute(hwnd,&data); } FreeLibrary(hm); } ,而没有CreateWindowEx。我尝试添加此标志,添加WS_EX_layered调用,将DwmBlurBehindWindowSetlayeredWindowAttributeLWA_ALPHA添加,但是我得到的唯一结果是-透明,没有任何模糊。

以下是LWA_COLORKEY中的一些代码

WM_PAINT

我想念什么?


旧库,客户端中的相同代码

enter image description here

新库,hdc = BeginPaint(hwnd,&ps); hdcc = CreateCompatibleDC(hdc); BITMAPINFO bmi; LPBYTE bits; ZeroMemory(&bmi,sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = ps.rcPaint.right - ps.rcPaint.left; bmi.bmiHeader.biHeight = ps.rcPaint.bottom - ps.rcPaint.top; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; bm = CreateDIBSection(hdcc,&bmi,DIB_RGB_COLORS,(void**)&bits,NULL,0); //All draws here. The first one is Gdi+ background draw with alfa brush SetStretchBltMode(hdc,COLORONCOLOR); SetStretchBltMode(hdcc,COLORONCOLOR); StretchBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right - ps.rcPaint.left,ps.rcPaint.bottom - ps.rcPaint.top,hdcc,SRCcopY); EndPaint(hwnd,&ps); 调用,设置DwmBlurBehindWindowWS_EX_layered调用没有任何效果,客户端中的代码相同:

enter image description here

新库,没有SetlayeredWindowAttribute,客户端中的代码相同:

enter image description here

解决方法

我不太了解自己的所作所为,但现在可以了。

首先,我应该说,该库不仅提供函数,还提供接口-抽象类。

第二个-创建窗口的HWND实际上不返回,因为创建窗口的功能无效。我通过FindWindow()找到了窗口。

GetLastError()之后的

SetWindowCompositionAttribute()返回6,但是现在,如果它起作用,它将返回10-ERROR_BAD_ENVIRONMENT 10(0xA) 环境不正确。

我在尝试调用MessageBox()来显示错误代码时也崩溃了。即使我只是检查hwnd是否等于NULL,程序也崩溃了。

摘要

正如我所提到的,我决定进行新的构建,因为我想要一些新功能。 似乎,当前新dll中的抽象接口类与客户端中的抽象接口类不同,而在旧dll中则是。我认为问题出在此。