Windows 10 CredentialProvider平铺图像透明度

时间:2016-05-02 18:56:56

标签: c++ c winapi windows-10 credential-providers

前段时间,我为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()背景颜色参数的其他值,例如AlphaMaskAlphaShift,但这些值也不起作用(相反,白色背景变黑)

有没有办法实现我的目标?

2 个答案:

答案 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调用中返回虚拟用户。