You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非Unity的C# .NET中通过SteamWorks获取并显示玩家头像?

解决SteamWorks获取玩家头像并显示在PictureBox的问题

嘿,我来帮你一步步搞定这个事儿!你已经开了个好头,SteamWorks对新手来说确实有不少需要注意的细节,咱们把剩下的步骤补全,让头像顺利显示在你的PictureBox里。

首先,先确认SteamAPI的基础初始化

这是最容易被新手忽略的前提!必须确保Steam客户端正在运行,并且你的程序正确初始化了SteamAPI,不然所有操作都会失败。

在你的Form加载事件里加上这段代码:

private Callback<AvatarImageLoaded_t> _avatarLoadedCallback;

private void Form1_Load(object sender, EventArgs e)
{
    // 如果你还没设置AppID,要么在这行设置,要么在程序目录创建steam_appid.txt写入你的测试AppID
    // SteamAPI.SetAppID(123456); // 替换成你的测试AppID

    // 初始化SteamAPI
    if (!SteamAPI.Init())
    {
        MessageBox.Show("SteamAPI初始化失败!请确保Steam客户端正在运行,且AppID配置正确。");
        Application.Exit();
        return;
    }

    // 注册头像加载完成的回调(非常重要!因为头像不会立即就绪)
    _avatarLoadedCallback = Callback<AvatarImageLoaded_t>.Create(OnAvatarLoaded);
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // 程序退出时一定要关闭SteamAPI,避免资源泄漏
    SteamAPI.Shutdown();
}

补全头像获取与转换的核心代码

你之前的代码已经拿到了头像句柄和尺寸,接下来要获取头像的RGBA数据,再转换成PictureBox能识别的Bitmap:

private void LoadSteamAvatar()
{
    // 获取当前登录用户的SteamID
    SteamID currentUserSteamId = SteamUser.GetSteamID();

    // 获取中等尺寸的头像句柄(也可以用GetSmallFriendAvatar或GetLargeFriendAvatar)
    int avatarHandle = SteamFriends.GetMediumFriendAvatar(currentUserSteamId);

    // 检查头像句柄是否有效(0表示头像未加载或不存在)
    if (avatarHandle == 0)
    {
        MessageBox.Show("头像尚未加载,请稍等片刻再试!");
        return;
    }

    // 获取头像的宽高
    uint avatarWidth, avatarHeight;
    if (!SteamUtils.GetImageSize(avatarHandle, out avatarWidth, out avatarHeight))
    {
        MessageBox.Show("无法获取头像尺寸!");
        return;
    }

    // 创建存储RGBA像素数据的数组(每个像素占4字节:R、G、B、A)
    byte[] avatarPixelData = new byte[4 * avatarWidth * avatarHeight];

    // 从Steam获取头像的RGBA数据
    if (!SteamUtils.GetImageRGBA(avatarHandle, avatarPixelData, avatarPixelData.Length))
    {
        MessageBox.Show("无法读取头像像素数据!");
        return;
    }

    // 将字节数组转换为Bitmap
    using (Bitmap avatarBitmap = new Bitmap((int)avatarWidth, (int)avatarHeight, PixelFormat.Format32bppArgb))
    {
        // 锁定Bitmap的内存区域,方便直接写入像素数据
        BitmapData bitmapData = avatarBitmap.LockBits(
            new Rectangle(0, 0, avatarBitmap.Width, avatarBitmap.Height),
            ImageLockMode.WriteOnly,
            avatarBitmap.PixelFormat);

        // 把像素数据复制到Bitmap的内存中
        System.Runtime.InteropServices.Marshal.Copy(avatarPixelData, 0, bitmapData.Scan0, avatarPixelData.Length);

        // 解锁内存
        avatarBitmap.UnlockBits(bitmapData);

        // 更新PictureBox的图像(注意跨线程问题!Steam回调在非UI线程)
        UpdatePictureBoxWithAvatar(avatarBitmap);
    }
}

// 专门处理UI更新的方法,确保在UI线程执行
private void UpdatePictureBoxWithAvatar(Bitmap avatarBitmap)
{
    if (pictureBoxAvatar.InvokeRequired)
    {
        // 如果当前不是UI线程,就委托UI线程执行
        pictureBoxAvatar.Invoke(new Action(() =>
        {
            // 先释放之前的图像资源,避免内存泄漏
            pictureBoxAvatar.Image?.Dispose();
            pictureBoxAvatar.Image = new Bitmap(avatarBitmap);
        }));
    }
    else
    {
        pictureBoxAvatar.Image?.Dispose();
        pictureBoxAvatar.Image = new Bitmap(avatarBitmap);
    }
}

// 头像加载完成的回调方法
private void OnAvatarLoaded(AvatarImageLoaded_t callback)
{
    // 确认是当前用户的头像加载完成
    if (callback.m_steamID == SteamUser.GetSteamID())
    {
        // 调用加载头像的方法
        LoadSteamAvatar();
    }
}

新手必看的注意事项

  • AppID配置:你需要在Steam开发者后台创建一个测试应用,拿到AppID。要么在代码里用SteamAPI.SetAppID(你的AppID)设置,要么在程序根目录创建一个steam_appid.txt文件,里面只写你的AppID数字。
  • Steam客户端必须运行:SteamAPI只能在Steam客户端运行的情况下初始化成功,而且你的程序需要通过Steam启动(或者把程序放在Steam库的游戏目录下)。
  • 内存泄漏问题:每次更新PictureBox的Image时,一定要释放之前的Image资源,不然程序运行久了会占用越来越多的内存。
  • 头像加载时机:不要刚初始化就立刻调用LoadSteamAvatar,因为Steam需要时间加载头像,用AvatarImageLoaded_t回调是最可靠的方式,等头像加载完成再去获取数据。

现在把这些代码整合到你的项目里,应该就能顺利显示Steam玩家的头像啦!

内容的提问来源于stack exchange,提问作者nie kruk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:42