ZXPoo 发表于 2025-6-13 17:11:16

QT怎么获取实时的电脑的账户名

void TCPClient::InitHostInfo()
{
                //m_username = QString::fromLocal8Bit(qgetenv("USERNAME")).toStdString();
#ifdef _WIN32
                // 使用 Windows API 获取实时账户名
                TCHAR username;
                DWORD username_len = UNLEN + 1;
                if (GetUserName(username, &username_len)) {
                        m_username = QString::fromWCharArray(username).toStdString();
                }
                std::cout << "电脑名称: " << m_username << std::endl;
#else
                m_username = qgetenv("USER").toStdString();
#endif
                m_osVersion = QSysInfo::prettyProductName().toStdString();
                //m_username = getCurrentUserName().toStdString();

                const QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
                for (const QNetworkInterface& netInterface : interfaces) {
                        // 跳过虚拟网卡、未启用网卡、环回网卡
                        if (!(netInterface.flags() & QNetworkInterface::IsUp) || !(netInterface.flags() & QNetworkInterface::IsRunning) || (netInterface.flags() & QNetworkInterface::IsLoopBack) ||
                                netInterface.humanReadableName().contains("VMware", Qt::CaseInsensitive) ||
                                netInterface.humanReadableName().contains("VirtualBox", Qt::CaseInsensitive))
                        {
                                continue;
                        }

                        const QList<QNetworkAddressEntry> entries = netInterface.addressEntries();
                        for (const QNetworkAddressEntry& entry : entries) {
                                QHostAddress ip = entry.ip();
                                if (ip.protocol() == QAbstractSocket::IPv4Protocol &&
                                        !ip.isLoopback() &&
                                        !ip.toString().startsWith("169.254"))// 排除自动私有地址
                                {
                                        m_ipAddress = ip.toString().toStdString();
                                        m_macAddress = netInterface.hardwareAddress().toStdString();
                                        return;
                                }
                        }
                }
}
这个函数开头是获取账户名的代码,但是现在的问题是原来的账户名是PC,不管我怎么改名字,获取的始终是PC,这个是为什么?

FishC 发表于 2025-6-13 17:12:08

在Qt中获取实时电脑账户名,可以使用Windows API或跨平台方法。以下是修正后的代码(支持Windows和Linux/macOS):

#include <QString>
#include <iostream>

#ifdef Q_OS_WIN
#include <windows.h> // Windows头文件
#include <Lmcons.h>// 需要UNLEN常量
#else
#include <unistd.h> // Unix-like系统头文件
#include <pwd.h>
#endif

void TCPClient::InitHostInfo()
{
#ifdef Q_OS_WIN
    // Windows方案
    wchar_t username;
    DWORD username_len = UNLEN + 1;
    if (GetUserNameW(username, &username_len)) {
      m_username = QString::fromWCharArray(username).toStdString();
    } else {
      m_username = "UnknownUser";
    }
#else
    // Linux/macOS方案
    struct passwd *pwd = getpwuid(geteuid());
    if (pwd) {
      m_username = QString(pwd->pw_name).toStdString();
    } else {
      m_username = "UnknownUser";
    }
#endif
    std::cout << "Username: " << m_username << std::endl;
}

关键说明:
1. Windows修正:
   - 将 `TCHAR username` 改为宽字符数组 `wchar_t username`
   - 使用 `GetUserNameW` 避免编码问题
   - 添加错误处理默认值

2. 跨平台支持:
   - `#ifdef Q_OS_WIN` 自动识别系统
   - Linux/macOS通过 `getpwuid(geteuid())` 获取账户名

3. 需包含的库:
   - Windows:自动链接 `Advapi32.lib`
   - Unix-like:无需额外库

4. 注意事项:
   - 在.pro文件中添加:`win32: LIBS += -ladvapi32`
   - 环境变量方式(如qgetenv("USER"))不可靠,不推荐使用

建议:
优先使用此跨平台方案,避免环境变量获取导致的权限问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2025-6-14 14:24:08

如果你需要“账户名”,你目前的代码没问题,获取的就是账户名。

如果你需要“计算机名”,请用 QHostInfo::localHostName() 或 GetComputerName()。

ZXPoo 发表于 2025-6-16 08:34:16

小甲鱼的二师兄 发表于 2025-6-14 14:24
如果你需要“账户名”,你目前的代码没问题,获取的就是账户名。

如果你需要“计算机名”,请用 QHostIn ...

但是我修改账户名的话就获取不到新的名字,永远都是PC
页: [1]
查看完整版本: QT怎么获取实时的电脑的账户名