【问题标题】:Get user picture获取用户图片
【发布时间】:2012-02-27 05:25:30
【问题描述】:

操作系统:Win7x64 (2008,2008r2)。 朗:Delphi Xe2。

  1. 如何接收图像“用户帐户图片”的完整路径(和文件名)?
  2. 如何设置新图片?

delphi 的例子。

需要: ...函数GetCurrentUserPicture:string;

...函数 GetUserPicture(UserName:String):string;

...函数 SetUserNewPicture(UserName, ImageFileName:String):bool;

【问题讨论】:

标签: delphi winapi


【解决方案1】:

shell32.dll 中有一个未记录的函数。在 Windows XP 上它的序号是 233,在 Windows Vista 和 7 上它的序号是 261。

它的函数原型(from Airesoft)是:

HRESULT WINAPI SHGetUserPicturePath (
    LPCWSTR pwszPicOrUserName, 
    DWORD sguppFlags, 
    LPWSTR pwszPicPath, 
    UINT picPathLen 
)

您可以使用此函数检索存储用户图片的路径。只需将用户名作为 pwszPicOrUserName 传递,将要存储图片路径的缓冲区作为 pwszPicPath 并将缓冲区的大小(以字符为单位)作为 picPathLen 传递。您可以将 sguppFlags 设置为 0 或任何可能的 other flags

还有一个未记录的函数,您可以使用它来设置用户的用户图片。它的序号在 Windows XP 上是 234,在 Windows Vista 和 Windows 7 上是 262。

它的函数原型(from Airesoft)是:

HRESULT WINAPI SHSetUserPicturePath ( 
    LPWSTR pwszAcctName, 
    DWORD reserved, 
    LPCWSTR pwszPictureFile 
)

将要更改其图片的用户的名称传递为 pwszAcctName,将要设置的图片的路径传递为 pwszPictureFile。将reserved设置为0。在调用此函数之前,您必须初始化COM。

根据 Microsoft 的说法,您不应依赖未记录的功能,因为它们可以通过安装在 Windows 上的任何补丁程序来删除或更改。

【讨论】:

  • +1,很酷,Airesoft 页面上有很多未记录的内容。很棒的提示!
  • 投反对票的人能解释一下吗?我的回答有什么问题?
  • Downvote 是来自我的移动浏览器的一次误点击。不知道那是怎么发生的。现在被删除了。话虽如此,我不得不说,如果使用这样的未记录功能,我会感到不安,特别是当有记录的方法可以做到这一点时,顺便会产生相同的结果。
  • @David,我个人并不害怕无证的东西,因为我不得不说,一些有证的东西比没有证的更容易误导。但它只是我的个人意见,我说的是至少有出口的函数。
  • 啊,你好,报复性投票 :-) 很好的网站,可以在书签中陪伴 ntinternals,顺便说一句!
【解决方案2】:

根据MSDN

在 Windows 7 或更高版本中,每个用户配置文件都有一个关联的图像 呈现为用户磁贴。这些图块在用户上显示给用户 帐户控制面板项及其管理帐户子页面.. 默认访客和默认用户帐户的图像文件也 如果您具有管理员访问权限,则会出现在此处。

....

用户的平铺图像存储为 C:\Users\\Local\Temp 文件夹为 .bmp。任何斜线 字符 () 转换为加号字符 (+)。例如, DOMAIN\user 转换为 DOMAIN+user。

我找不到获取图像的 API,并且由于官方文档正在调用此实现细节,我认为这意味着您可以安全地依赖它。那就是我认为这是获取平铺图像的受支持方式。

【讨论】:

  • @user539484:图像是的,位置不是。 XP 不使用 C:\Users 文件夹。不确定Vista。因此,您至少必须使用“USERDATA”CSIDL 或 KNOWN FOLDER 之类的东西。搜索刚刚发现我的 XP 帐户文件夹中的任何位置都没有 .bmp 文件。因此,虽然帐户应该对要使用的图像进行一些设置,但图像本身不会像 Win7 那样存储/复制到帐户。
  • 我对否决票很好奇。是因为这是Win7特有的吗?还是因为我不知道有更好的方法来做到这一点?
  • 大卫,显然@user539484 似乎知道的更多,但(s)他在用勺子喂它......
  • @user539484:我为什么要拥有? (引用的)文档在哪里说用户应该这样做?如果 Vista/XP 需要它,那么我的评论仍然有效,而您认为该信息可用于 Vista/XP 的评论不正确或至少不可靠。
  • 大卫,我们中间似乎有一个新的 DownvoterStepIntoTheLight aka PrematureOptimization。 @user539484 至少显示了该人几乎所有的行为模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
相关资源
最近更新 更多