-1

不久前,我为 Windows 7 创建了一个 CredentialProvider,它为用户显示了一个自定义平铺图像。当我在 Windows 10 上测试我的 CredentialProvider 时,我注意到平铺图像不像通常的 Windows 用户图像那样是圆形的,所以我假设我必须提供我自己的具有透明度的圆形图像。我试图加载一个圆形的透明PNG并HBITMAPICredentialProviderCredentiall::GetBitmapValue()函数中传递相应的。不幸的是,PNG 的背景不是透明的,而是白色的。有没有办法显示实际的透明度?由于HBITMAP是由 LogonUI 本身绘制的,因此我无法修改绘图行为。

为了创建HBITMAP我的 PNG 资源,我使用以下函数:

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()例如AlphaMaskand AlphaShift,但是这些也不起作用(相反,白色背景变成了黑色)

有什么方法可以实现我的目标吗?

4

2 回答 2

0

最新的Credential Provider Technical Reference(在 MSDN 上并不容易找到)实际上说明了平铺图像的问题是:

在 Windows 10 中,所选用户/V1/PLAP 凭据提供程序的图像大小为 192x192。左下方列表中的那些是 48x48。 注意 LogonUI根据新的设计方向,用户使用圆形图像,V1/PLAP使用方形图像。所选用户下的 V2 Credential Provider 磁贴的图像大小为 48x48。

于 2017-02-10T20:06:10.843 回答
0

如果我正确阅读了文档,那么挑战必须以某种方式说服 LogonUI 它是用户而不是 V1/PLAP,我认为这可以在 GetSerialization 调用中返回一个虚拟用户。

于 2017-02-13T13:52:34.277 回答