问题描述
我有一个处理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
调用,将DwmBlurBehindWindow
和SetlayeredWindowAttribute
或LWA_ALPHA
添加,但是我得到的唯一结果是-透明,没有任何模糊。
以下是LWA_COLORKEY
中的一些代码:
WM_PAINT
我想念什么?
旧库,客户端中的相同代码:
新库,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);
调用,设置DwmBlurBehindWindow
或WS_EX_layered
调用没有任何效果,客户端中的代码相同:
新库,没有SetlayeredWindowAttribute
,客户端中的代码相同:
解决方法
我不太了解自己的所作所为,但现在可以了。
首先,我应该说,该库不仅提供函数,还提供接口-抽象类。
第二个-创建窗口的HWND实际上不返回,因为创建窗口的功能无效。我通过FindWindow()
找到了窗口。
GetLastError()
之后的 SetWindowCompositionAttribute()
返回6,但是现在,如果它起作用,它将返回10-ERROR_BAD_ENVIRONMENT
10(0xA)
环境不正确。
我在尝试调用MessageBox()
来显示错误代码时也崩溃了。即使我只是检查hwnd
是否等于NULL
,程序也崩溃了。
摘要
正如我所提到的,我决定进行新的构建,因为我想要一些新功能。 似乎,当前新dll中的抽象接口类与客户端中的抽象接口类不同,而在旧dll中则是。我认为问题出在此。