前段时间,我为Windows 7创建了一个CredentialProvider,为用户显示了一个自定义图块图像。当我在Windows 10上测试我的CredentialProvider时,我注意到平铺图像不像通常的Windows用户图像那样是圆的,所以我假设,我必须提供我自己的圆形图像和透明度。我尝试加载圆形的透明PNG,并在HBITMAP
函数中传递相应的ICredentialProviderCredentiall::GetBitmapValue()
。不幸的是,PNG的背景不是透明的,而是白色的。有没有办法显示实际的透明度?由于HBITMAP
是由LogonUI本身绘制的,因此我无法修改绘图行为。
要从我的PNG资源中创建HBITMAP
,我使用以下函数:
HBITMAP LoadPNG(HINSTANCE hInst, int resourceId)
{
HGLOBAL hGlobal;
LPSTREAM pStream;
HBITMAP tBmp = NULL;
ULONG_PTR token = 0;
Gdiplus::GdiplusStartupInput input = NULL;
Gdiplus::GdiplusStartup(&token, &input, NULL);
if (token != 0)
{
HRSRC hRsrc = FindResource(hInst, MAKEINTRESOURCE(resourceId), TEXT("PNG"));
HGLOBAL hGlob1 = LoadResource(hInst, hRsrc);
int size = SizeofResource(hInst, hRsrc);
hGlobal = GlobalAlloc(GMEM_FIXED, size);
LPVOID resPtr = LockResource(hGlob1);
memcpy(hGlobal, resPtr, size);
FreeResource(hGlob1);
CreateStreamOnHGlobal(hGlobal, true, &pStream);
Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(pStream, false);
bmp->GetHBITMAP(Gdiplus::Color::Transparent, &tBmp);
Gdiplus::GdiplusShutdown(token);
}
return tBmp;
}
我还尝试了GetHBITMAP()
背景颜色参数的其他值,例如AlphaMask
和AlphaShift
,但这些值也不起作用(相反,白色背景变黑)
有没有办法实现我的目标?
答案 0 :(得分:0)
最新的Credential Provider Technical Reference(在MSDN上不容易找到)实际上说明了图块图像的问题:
在Windows 10中,所选的User / V1 / PLAP凭据提供程序具有 图像大小为192x192。左下角的列表是48x48。 注意LogonUI对用户使用圆形图像,对V1 / PLAP使用 square 图像 根据新的设计方向。 V2 Credential的图像大小 所选用户下的提供者磁贴为48x48。
答案 1 :(得分:-2)
如果我正确阅读文档,那么挑战必须以某种方式说服LogonUI其用户而不是V1 / PLAP,我认为这可以在GetSerialization调用中返回虚拟用户。