1. 程式人生 > 其它 >Qt知識點梳理 —— 獲取裝置CPU、記憶體、磁碟等硬體資訊

Qt知識點梳理 —— 獲取裝置CPU、記憶體、磁碟等硬體資訊

技術標籤:QtC/C++qtc++

文章目錄

簡介

WMIC指令

具體實現

獲取電腦名稱

獲取CPU資訊

獲取CPU序列號

獲取記憶體資訊

獲取第一個磁碟序列號

獲取磁碟資訊

獲取作業系統資訊

獲取主機板序列號

獲取網絡卡MAC地址

獲取裝置聯網狀態

執行效果

專案原始碼

開發環境


簡介

工業應用領域,我們經常需要獲取裝置的硬體及軟體資訊,用以做裝置軟硬體判斷,在此將常用的方法彙總,以便後續直接呼叫; 原始碼中已將方法封裝為標準類,歡迎補充;

其中包括:電腦名稱、CPU資訊、CPU序列號、記憶體詳細資訊、磁碟序列號、磁碟詳細資訊、作業系統資訊、主機板序列號、顯示卡資訊、所有網絡卡的MAC地址、裝置聯網狀態;

WMIC指令

在Windows環境下,我們可以通過使用WMIC獲取裝置的硬體資訊,如下:

wmic cpu get Name                                                  //獲取CPU名稱
wmic cpu get NumberOfCores                                         //獲取CPU核心數
wmic cpu get NumberOfLogicalProcessors                             //獲取CPU執行緒數
wmic cpu get processorid                                           //獲取CPU序列號
wmic baseboard get serialnumber                                    //獲取主機板序列號
wmic csproduct                                                     //獲取主機板資訊
wmic bios get serialnumber                                         //獲取BIOS序列號
wmic diskdrive get serialnumber                                    //獲取磁碟序列號
wmic logicaldisk get name,Description,filesystem,size,freespace    //獲取磁碟資訊
wmic diskdrive where index=0 get serialnumber                      //獲取第一個磁碟序列號
wmic nic where netconnectionid!=NULL get MacAddress                //獲取不為空的MAC地址
wmic memorychip get Capacity,TAG                                   //獲取記憶體資訊
wmic os get Caption,CSDVersion,CSName,SerialNumber,Version         //獲取作業系統系統資訊

使用,將上述指令傳入即可:

//呼叫Windows WMIC指令 獲取硬體資訊 此方法僅適用於Windows環境
QString GetHardWare::GetWare(QString cmd)
{
    QProcess p;
    p.start(cmd);
    p.waitForFinished();
    QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
    QStringList list = cmd.split(" ");
    result = result.remove(list.last(), Qt::CaseInsensitive);
    result = result.replace("\r", "");
    result = result.replace("\n", "");
    result = result.simplified();
    return result;
}

具體實現

獲取電腦名稱

如果此處報錯,這裡沒詳細描述,可檢視:【Qt/C++異常筆記】“QHostInfo”: 不是類或名稱空間名稱

//獲取電腦名字
QString GetHardWare::getMachineName()
{
    QString machineName = QHostInfo::localHostName();
    return machineName;
}

獲取CPU資訊

如:Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz

//獲取CPU資訊
QString GetHardWare::getCpuInfo()
{
    return GetWare("wmic cpu get name");
}

獲取CPU序列號

//獲取CPU序列號
QString GetHardWare::getCpuSerial()
{
    return GetWare("wmic cpu get processorid");
}

獲取記憶體資訊

返回資訊依次為:已使用記憶體大小、未使用記憶體大小、總記憶體大小,單位為MB;

如:("5041", "3001", "8042")

//獲取記憶體資訊
//返回資訊依次為:已使用記憶體大小、未使用記憶體大小、總記憶體大小,單位為MB
//如:("5041", "3001", "8042")
QStringList GetHardWare::getMemoryInfo()
{
    QStringList m_memInfo;

    int memoryPercent;
    int memAll;
    int memUse;
    int memFree;

    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);
    memoryPercent = statex.dwMemoryLoad;
    memAll = statex.ullTotalPhys / MB;
    memFree = statex.ullAvailPhys / MB;
    memUse = memAll - memFree;

    m_memInfo.append(QString::number(memUse));
    m_memInfo.append(QString::number(memFree));
    m_memInfo.append(QString::number(memAll));

    return m_memInfo;
}

獲取第一個磁碟序列號

//獲取第一個磁碟序列號
QString GetHardWare::getDiskSerial()
{
    return GetWare("wmic diskdrive where index=0 get serialnumber");//只能在Windows環境下使用
}

獲取磁碟資訊

返回資訊依次為:磁碟名稱、已使用空間大小、未使用空間大小、總空間大小、使用百分比;

如:(("C:/", "92.9G", "122.5G", "215.5G", "43"),
("D:/", "175.8G", "135.2G", "311.0G", "56"),
("E:/", "90.9G", "220.1G", "311.0G", "29"),
("F:/", "243.1G", "66.4G", "309.5G", "78"))

//獲取磁碟資訊
//返回資訊依次為:磁碟名稱、已使用空間大小、未使用空間大小、總空間大小、使用百分比
//如:   (("C:/", "92.9G", "122.5G", "215.5G", "43"),
//      ("D:/", "175.8G", "135.2G", "311.0G", "56"),
//      ("E:/", "90.9G", "220.1G", "311.0G", "29"),
//      ("F:/", "243.1G", "66.4G", "309.5G", "78"))
QList<QStringList> GetHardWare::getDiskInfo()
{
    QList<QStringList> diskList;

    QFileInfoList list = QDir::drives();
    foreach (QFileInfo dir, list)
    {
        QStringList curDisk;
        QString dirName = dir.absolutePath();
        LPCWSTR lpcwstrDriver = (LPCWSTR)dirName.utf16();
        ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
        if(GetDiskFreeSpaceEx(lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
        {
            //已使用的空間大小
            QString use = QString::number((double) (liTotalBytes.QuadPart - liTotalFreeBytes.QuadPart) / GB, 'f', 1);
            use += "G";
            //未使用的空間大小
            QString free = QString::number((double) liTotalFreeBytes.QuadPart / GB, 'f', 1);
            free += "G";
            //總空間大小
            QString all = QString::number((double) liTotalBytes.QuadPart / GB, 'f', 1);
            all += "G";
            //使用率百分比
            int percent = 100 - ((double)liTotalFreeBytes.QuadPart / liTotalBytes.QuadPart) * 100;

            curDisk.append(dirName);
            curDisk.append(use);
            curDisk.append(free);
            curDisk.append(all);
            curDisk.append(QString::number(percent));
        }
        diskList.append(curDisk);
    }
    return diskList;
}

獲取作業系統資訊

如:Windows 10 Version 1909 64bit

//獲取系統資訊
//如:Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
QString GetHardWare::getOSInfo()
{
    QString m_osInfo;
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    if (NULL != fnIsWow64Process)
    {
        fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    }
    QString sysBit = "unknown";
    if(bIsWow64)
        sysBit = "64bit";
    else
        sysBit = "32bit";

    m_osInfo = QSysInfo::prettyProductName() + " " + sysBit;
    return m_osInfo;
}

獲取主機板序列號

//獲取主機板序列號
QString GetHardWare::getBiosSerial()
{
    return GetWare("wmic baseboard get serialnumber");
}

獲取網絡卡MAC地址

如:("00:15:5D:A2:BD:C7", "00:50:56:C0:00:01", "00:50:56:C0:00:08", "D8:F2:CA:6D:6A:2D")

//獲取所有網絡卡的MAC地址
//如:("00:15:5D:A2:BD:C7", "00:50:56:C0:00:01", "00:50:56:C0:00:08", "D8:F2:CA:6D:6A:2D")
QStringList GetHardWare::getMacAddress()
{
    QStringList macList;
    QList<QNetworkInterface> netList = QNetworkInterface::allInterfaces();
    foreach(QNetworkInterface item, netList)//遍歷所有網絡卡
    {
        if((QNetworkInterface::IsUp & item.flags()) && (QNetworkInterface::IsRunning & item.flags())
                && (item.hardwareAddress().toStdString().length()>0))
        {
            macList.append(item.hardwareAddress());
        }
    }
    return macList;
}

獲取裝置聯網狀態

如果裝置已連線外網,則返回True;否則返回False

//獲取聯網狀態
bool GetHardWare::getInternetState()
{
    //能ping的通百度則說明可以聯網
    QTcpSocket tcpClient;
    tcpClient.abort();
    tcpClient.connectToHost("www.baidu.com", 80);
    //100毫秒沒有連線上則判斷不線上
    return tcpClient.waitForConnected(100);
}

執行效果

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug() << "MachineName: " << GetHardWare::getMachineName();
    qDebug() << "CpuInfo: " << GetHardWare::getCpuInfo();

    qDebug() << "MemoryInfo: " << GetHardWare::getMemoryInfo();
    qDebug() << "OSInfo: " << GetHardWare::getOSInfo();
    qDebug() << "DiskSerial: " << GetHardWare::getDiskSerial();
    qDebug() << "MacAddress: " << GetHardWare::getMacAddress();
    qDebug() << "InternetState: " << GetHardWare::getInternetState();
    qDebug() << "DiskInfo: " << GetHardWare::getDiskInfo();

    qDebug() << "CpuSerial: " << GetHardWare::getCpuSerial();
    qDebug() << "BiosSerial: " << GetHardWare::getBiosSerial();
}

專案原始碼

GitHub:lizhifun / QtHardWareDemo

開發環境

Author:Lizhifun

OS:Windows 10 家庭中文版

Compiler:Microsoft Visual C++ Compiler 15.9.28307.1259(amd64)

Kit:Desktop Qt 5.14.2 MSVC2017 64bit

Qt Creator:4.11.1