QT C++ 获取计算机软件、硬件信息cpu、内存、显卡、操作系统等信息

    在使用QT 和 C++编程过程中,我们来讲讲怎样获取计算机软件和硬件信息,包括计算机名称、cpu、显卡、内存、操作系统、几个屏幕以及每个屏幕的分辨率、硬盘信息、IP、MAC地址、公网IP、以及是否能够联网等信息。


头文件包含

#include <QHostAddress>
#include <QNetworkInterface>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QSysInfo>
#include "QSettings"
#include "QDebug"
#include <QDesktopWidget>
#include <QFileInfoList>
#include <QDir>
#include <QLibrary>
#include <QTimer>
#include <QHostInfo>

1.获取计算机名称

const QString Info::localmachineName()
{
    QString machineName = QHostInfo::localHostName();
    return machineName;
}

2.本地IP地址

const QString Info::ip()
{
    QString ip="";

    QList<QNetworkInterface> interFaceList = QNetworkInterface::allInterfaces();
    for(int i=0; i< interFaceList.size(); i++)
    {
        QNetworkInterface interface = interFaceList.at(i);
        if(interface.flags().testFlag(QNetworkInterface::IsRunning))
        {
            QList<QNetworkAddressEntry> entryList = interface.addressEntries();
            foreach(QNetworkAddressEntry entry, entryList)
            {
                if(QAbstractSocket::IPv4Protocol == entry.ip().protocol() &&
                   entry.ip() != QHostAddress::LocalHost && entry.ip().toString().startsWith("192.168."))
                {
                    ip = entry.ip().toString();
                    break;
                }
            }
        }
    }

    return ip;
}

3.公网IP

const QString Info::publicIp()
{
    QString strIp;
    QString webCode = getHtml("http://whois.pconline.com.cn/");

    if(!webCode.isEmpty())
    {
        QString web = webCode.replace(" ", "");
        web = web.replace("\r", "");
        web = web.replace("\n", "");
        QStringList list = web.split("<br/>");
        QString tar = list[3];
        QStringList ip = tar.split("=");
        strIp = ip[1];
    }
    else
        strIp="无法获取公网ip";


    return strIp;
}


4.获取计算机MAC地址

const QString Info::mac()
{
    QString strMac;

    QList<QNetworkInterface> netList = QNetworkInterface::allInterfaces();
    foreach(QNetworkInterface item, netList)
    {
        if((QNetworkInterface::IsUp & item.flags()) && (QNetworkInterface::IsRunning & item.flags()))
        {
            if(strMac.isEmpty() || strMac < item.hardwareAddress())
            {
                strMac = item.hardwareAddress();
            }
        }
    }
    return strMac;
}


5.获取计算机CPU信息

const QString& Info::cpuType()
{
    QSettings *CPU = new QSettings("HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",QSettings::NativeFormat);
    m_cpuDescribe = CPU->value("ProcessorNameString").toString();
    delete CPU;

    return m_cpuDescribe;
}

6.获取计算机显卡信息

const QString Info::dCard()
{
    QString dcard;
    QSettings *DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\nvlddmkm\\Device0",QSettings::NativeFormat);
    QString type = DCard->value("Device Description").toString();
    delete DCard;

    QString dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dType;

    DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\igfx\\Device0",QSettings::NativeFormat);
    type = DCard->value("Device Description").toString();
    delete DCard;

    dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dcard + "\n" +dType;

    DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\amdkmdap\\Device0",QSettings::NativeFormat);
    type = DCard->value("Device Description").toString();
    delete DCard;

    dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dcard + "\n" +dType;

    dcard.trimmed();
    return dcard;
}


7.获取计算机内存

#include <Windows.h>
const QString& Info::memory()
{
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);
    m_totalMem = statex.ullTotalPhys  * 1.0/ GB;
    m_freeMem = statex.ullAvailPhys * 1.0 / GB;

    m_memDescribe = QString("可用 %1 GB / 共 %2 GB" ).
            arg(QString::asprintf("%.2f", m_freeMem)).arg(QString::asprintf("%.2f", m_totalMem));

    return m_memDescribe;
}


8.获取计算机操作系统

const QString& Info::osVersion()
{
    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 = "64位";
    else
        sysBit = "32位";

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


9.获取计算机屏幕个数以及像素

const QString& Info::screen()
{
    m_screenDescribe = "";
    QList<QSize> screenSizeList;
    QList <int> screenCountList;

    for(int i=0; i<QApplication::desktop()->screenCount(); i++)
    {
        QRect screenRect = QApplication::desktop()->screenGeometry(i);
        QSize size(screenRect.width(), screenRect.height());

        bool bExist = false;
        for(int j=0; j<screenSizeList.length(); j++)
        {
            QSize existSize = screenSizeList.at(j);
            if(size == existSize)
            {
                screenCountList[j]++;
                bExist = true;
                break;
            }
        }

        if(!bExist)
        {
            screenSizeList.append(size);
            screenCountList.append(1);
        }
    }

    m_maxScreenSize = screenSizeList.at(0);
    for(int i=0; i<screenSizeList.length(); i++)
    {
        int width = screenSizeList.at(i).width();
        int height = screenSizeList.at(i).height();

        if(width > m_maxScreenSize.width() && height > m_maxScreenSize.height())
            m_maxScreenSize = screenSizeList.at(i);

        m_screenDescribe += QString ("(%1像素 x %2像素) x %3个").arg(width).arg(height).arg(screenCountList.at(i));
        if(i!= screenSizeList.length()-1)
            m_screenDescribe += "、 ";
    }

    return m_screenDescribe;
}


10.获取计算机硬盘信息

const QString& Info::disk()
{
    m_diskDescribe = "";
    QFileInfoList list = QDir::drives();
    foreach (QFileInfo dir, list)
    {
        QString dirName = dir.absolutePath();
        dirName.remove("/");
        LPCWSTR lpcwstrDriver = (LPCWSTR)dirName.utf16();
        ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
        if(GetDiskFreeSpaceEx(lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
        {
            QString free = QString::number((double) liTotalFreeBytes.QuadPart / GB, 'f', 1);
            free += "G";
            QString all = QString::number((double) liTotalBytes.QuadPart / GB, 'f', 1);
            all += "G";

            QString str = QString("%1 %2/%3       ").arg(dirName, free, all);
            m_diskDescribe += str;

            double freeMem = (double) liTotalFreeBytes.QuadPart / GB;

            if(freeMem > m_maxFreeDisk)
                m_maxFreeDisk = freeMem;
        }
    }

    return m_diskDescribe;
}

11.获取计算机安装的office版本

void Info::checkOffice(QString &describe)
{
    QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\excel.exe", QSettings::NativeFormat);
    QString path = settings.value("Path").toString();
    if(!path.isEmpty())
    {
        QSettings versionSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Excel.Application\\CurVer", QSettings::NativeFormat);
        QString version = versionSettings.value(".").toString();
        if(!version.isEmpty())
        {
            version = version.split(".").last();
            int versionNum = version.toInt();
            switch (versionNum)
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                    m_officeDecsribe = "Office 95以前版本";
                    break;
                case 6:
                    m_officeDecsribe = "Office 95";
                    break;
                case 8:
                    m_officeDecsribe = "Office 97";
                    break;
                case 9:
                    m_officeDecsribe = "Office 2000";
                    break;
                case 10:
                    m_officeDecsribe = "Office XP";
                    break;
                case 11:
                    m_officeDecsribe = "Office 2003";
                    break;
                case 12:
                    m_officeDecsribe = "Office 2007";
                    break;
                case 13:
                case 14:
                    m_officeDecsribe = "Office 2010";
                    break;
                case 15:
                    m_officeDecsribe = "Office 2013";
                    break;
                case 16:
                case 17:
                case 18:
                case 19:
                    m_officeDecsribe = "Office 2013以后版本";
                    break;
            default:
                break;
            }

            if(versionNum >= 13)//office 2010
            {
                describe = "已安装Office 版本:" + m_officeDecsribe;
            }
            else
            {
                describe = "建议安装Microsoft Offce2010以上版本。";
            }
        }
        else
        {
            describe = "建议安装Microsoft Offce2010以上版本。";
        }
    }
    else
    {
        describe = "建议安装Microsoft Offce2010以上版本。";
    }
}

12.判断计算机是否可以联网

bool Info::ipLive()
{
    //能接通百度IP说明可以通外网
    QTcpSocket tcpClient;
    tcpClient.abort();
    tcpClient.connectToHost("202.108.22.5", 80);
    //100毫秒没有连接上则判断不在线
    return tcpClient.waitForConnected(100);
}

13.获取网页所有源码

//获取网页所有源代码
QString Info::getHtml(QString url)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
    QByteArray responseData;
    QEventLoop eventLoop;
    QTimer *timer = new QTimer(this);
    timer->setSingleShot(true);

    connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
    connect(timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));

    timer->start(300);
    eventLoop.exec();
    responseData = reply->readAll();

    delete timer;

    return QString(responseData);
}

搞定,我做了个demo想要看源码的可以去看看https://download.csdn.net/download/xiezhongyuan07/10402206


猜你喜欢

转载自blog.csdn.net/xiezhongyuan07/article/details/80249626