电脑内存硬盘查看器(C++、QT版本和Python、PySide2版本)

电脑内存硬盘查看器[序列号和容量](C++、QT版本和Python、PySide2版本)

       由于最近有人问我电脑查看内存卡序列号和硬盘序列号的方式,我告诉他用WMIC指令查看,结果人家告诉我麻烦,于是我就写了这么个小工具,下面附下载链接——免积分。

       首先介绍一下原理,直接用代码调用cmd控制台执行多条指令(wmic)查询信息,然后将信息解析到界面输出。

1.WMIC查询指令

     查询硬盘序列号:

wmic DiskDrive get serialnumber

    查询硬盘容量:

wmic DiskDrive get Size /value

    查询内存条序列号:

wmic Path Win32_PhysicalMemory get serialnumber

    查询内存条容量:

wmic Path Win32_PhysicalMemory get Capacity /value

2.Python版本

    先是用Python+PySide2写了一个。直接上代码:

CHeckSerialID.py

#encoding=utf-8
from PySide2.QtCore import QFile
from PySide2.QtGui import QIcon
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QWidget


class CheckSerialID(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent=parent)
        #加载界面文件QDesigner编写
        self.uiFile=QFile("ui/CheckSerialID.ui")
        self.uiFile.open(QFile.ReadOnly)
        self.uiLoad=QUiLoader()
        self.ui=self.uiLoad.load(self.uiFile)
        #显示界面
        self.ui.show();
        #设置窗口标题
        self.ui.setWindowTitle(u"小黄人硬盘内存查看器")
        #设计窗口图标
        appIcon = QIcon("ui/ico.png")
        self.ui.setWindowIcon(appIcon)
        #绑定按钮消息
        self.ui.pushButton.clicked.connect(self.getButSlot)
    ##########################################################
    #函数名:按钮槽函数
    #功  能:响应按钮事件
    #参  数:无
    ###########################################################
    def getButSlot(self):
        mSN= self.getMermoryChipSerialId()
        dSN= self.getDiskSerialId()
        memoryVolume=self.getMemoryVolume();
        diskVolume=self.getDiskVolme()
        printS=u"\t********一共有"+str(dSN.__len__())+u"个磁盘,"+str(mSN.__len__())+"条内存条********\n\n"

        #磁盘信息
        i=0;
        strT=""
        for snl in dSN:
            if diskVolume.__len__()<i+1:
                strT=u"获取磁盘容量失败"
            else:
                strT=diskVolume[i]
            printS=printS+u"\t  第"+str(i+1)+u"个磁盘序列号:"+snl+"\n"
            printS=printS+u"\t  第"+str(i+1)+u"个磁盘容量为:"+strT+"GB\n"
            i = i + 1

        #内存信息
        i=0;
        for snl in mSN:
            if memoryVolume.__len__()<i+1:
                strT=u"获取内存大小失败"
            else:
                strT=memoryVolume[i]
            printS = printS + "\t第"+str(i+1)+u"条内存条序列号:" + snl + "\n";
            printS = printS + "\t第"+str(i+1)+u"条内存条大小为:" + strT + "GB\n";
            i=i+1

        self.ui.textBrowser.clear()
        self.ui.textBrowser.setText(printS)
        return

    ##########################################################
    # 函数名:获取内存序列号函数
    # 功  能:获取内存序列号
    # 输  入:无
    # 输  出:返  回 - strList:内存条序列号
    ###########################################################
    def getMermoryChipSerialId(self):
        import os
        result =os.popen("wmic memorychip get serialnumber").readlines();
        print(result)

        rlist = []
        for ax in result:
            if ax != '\n' and ax.find("SerialNumber")==-1:
                ax = ax.replace("Size=", "")
                ax = ax.replace("\n", "")
                rlist.append(ax)
        print(rlist)
        return rlist

    ##########################################################
    # 函数名:获取硬盘序列号函数
    # 功  能:获取硬盘序列号
    # 输  入:无
    # 输  出:返  回 - strList:硬盘序列号
    ###########################################################
    def getDiskSerialId(self):
        from wmi import WMI
        c = WMI()
        diskSerialList=[]
        snl=""
        # # 硬盘序列号
        for physical_disk in c.Win32_DiskDrive():
            snl = physical_disk.SerialNumber.replace("\n", "")
            snl = snl.replace(" ", "")
            diskSerialList.append(snl)
        return diskSerialList

    ##########################################################
    # 函数名:获取内存条容量函数
    # 功  能:获取内存条容量
    # 输  入:无
    # 输  出:返  回 - strList:内存条容量
    ###########################################################
    def getMemoryVolume(self):
        from os import popen
        result = popen("wmic Path Win32_PhysicalMemory get Capacity /value").readlines();
        rlist = []
        from pefile import long
        for ax in result:
            if ax != '\n':
                ax = ax.replace("Capacity=", "")
                ax = ax.replace("\n", "")
                axi = round(long(ax) / 1024 / 1024 / 1024)
                rlist.append(str(axi))
        return rlist

    ##########################################################
    # 函数名:获取硬盘内存函数
    # 功  能:获取硬盘内存
    # 输  入:无
    # 输  出:返  回 - strList:硬盘内存大小GB
    ###########################################################
    def getDiskVolme(self):
        from os import popen
        from pefile import long

        result = popen("wmic DiskDrive get Size /value").readlines();
        rlist=[]
        for ax in result:
            if ax!='\n':
                ax=ax.replace("Size=","")
                ax=ax.replace("\n","")
                axi=round(long(ax)/1024/1024/1024)
                rlist.append(str(axi))
        return  rlist

main.py

from sys import exit
from PySide2.QtWidgets import QApplication
from CheckSerialID import CheckSerialID

if __name__=="__main__":
    app=QApplication([])
    w=CheckSerialID()
    exit(app.exec_())

效果图:

由于Python发行打包后运行贼慢(大约双击后4s才显示界面)于是我准备用C++,QT再写一个。

3.C++、QT版本

直接上代码

#include "checkserialnumber.h"
/**********************************************************
*函数名:构造函数
*功  能:你说呢
*输  入:无
*输  出:无
***********************************************************/
CheckSerialNumber::CheckSerialNumber(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	setWindowTitle(QString::fromLocal8Bit("小黄人内存硬盘查看器"));
	QIcon ico("ico.png");
	setWindowIcon(ico);

	Qt::WindowFlags m_flags = windowFlags();
	setWindowFlags(m_flags | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
	this->setAttribute(Qt::WA_TranslucentBackground);//背景透明
}

/**********************************************************
*函数名:析构函数
*功  能:你猜
*输  入:无
*输  出:无
***********************************************************/
CheckSerialNumber::~CheckSerialNumber()
{

}

/**********************************************************
*函数名:查询按钮槽函数
*功  能:调用下面查询函数查询并显示到界面
*输  入:无
*输  出:无
***********************************************************/
void CheckSerialNumber::on_pushButton_clicked()
{
	QStringList MV= getMemoryV();
	QStringList MSN = getMemorySN();
	QStringList DSN = getDiskSN();
	QStringList DV = getDiskV();
	QString printS = "";
	QString heardS = QString::fromLocal8Bit("\t********一共有%1个硬盘和%2条内存条********\n").arg(DSN.count()).arg(MSN.count());
	printS = printS + heardS;
	for (int i = 0; i < DSN.count(); i++)
	{
		printS = printS + QString::fromLocal8Bit("\t  硬盘%1序列号为:%2\n").arg(i+1).arg(DSN.at(i));
		if (i >= DV.count())
			printS = printS + QString::fromLocal8Bit("\t  硬盘%1的容量为:获取失败\n");
		else
		{
			printS = printS + QString::fromLocal8Bit("\t  硬盘%1的容量为:%2G\n").arg(i+1).arg(DV.at(i));
		}

	}
	for (int i = 0; i < MSN.count(); i++)
	{
		printS = printS + QString::fromLocal8Bit("\t内存条%1序列号为:%2\n").arg(i+1).arg(MSN.at(i));
		if (i >= MV.count())
			printS = printS + QString::fromLocal8Bit("\t内存条%1的容量为:获取失败\n");
		else
		{
			printS = printS + QString::fromLocal8Bit("\t内存条%1的容量为:%2G\n").arg(i+1).arg(MV.at(i));
		}
	}
	ui.textBrowser->clear();
	ui.textBrowser->setText(printS);
}

/**********************************************************
*函数名:查询内存序列号函数
*功  能:查询内存序列号
*输  入:无
*输  出:返回 QStringList:内存序列号列表
***********************************************************/
QStringList CheckSerialNumber::getMemorySN()
{
	QProcess p(0);
	p.start("wmic Path Win32_PhysicalMemory get serialnumber");
	p.waitForStarted();
	p.waitForFinished();
	QString result = "";
	result = p.readAll();
	result = result.remove("SerialNumber");
	result = result.remove("\r");
	result = result.remove(" ");

	qint64 rv = 0;
	QStringList listT;
	QStringList resultList = result.split('\n', QString::SkipEmptyParts);
	for (int i = 0; i < resultList.count(); i++)
	{
		if (resultList.at(i) != "")
		{
			listT.append(resultList.at(i));

		}
	}
	return listT;
}

/**********************************************************
*函数名:查询内存容量
*功  能:获取内存容量
*输  入:无
*输  出:返回 QStringList:内存容量列表
***********************************************************/
QStringList CheckSerialNumber::getMemoryV()
{
	QProcess p(0);
	p.start("wmic Path Win32_PhysicalMemory get Capacity /value");
	p.waitForStarted();
	p.waitForFinished();
	QString result = "";
	result = p.readAll();
	result = result.remove("Capacity=");
	result = result.remove("\r");

	qint64 rv = 0;
	QStringList listT;
	QStringList resultList = result.split('\n', QString::SkipEmptyParts);
	for (int i = 0; i < resultList.count(); i++)
	{
		if (resultList.at(i) != "")
		{
			rv = resultList.at(i).toLongLong()/1024/1024/1024;
			listT.append(QString::number(rv));

		}
	}
	return listT;
}

/**********************************************************
*函数名:获取磁盘序列号函数
*功  能:获取磁盘序列号
*输  入:无
*输  出:返回 QStringList:获取磁盘序列号列表
***********************************************************/
QStringList CheckSerialNumber::getDiskSN()
{
	QProcess p(0);
	p.start("wmic DiskDrive get serialnumber");
	p.waitForStarted();
	p.waitForFinished();
	QString result = "";
	result = p.readAll();
	result = result.remove("SerialNumber");
	result = result.remove("\r");
	result = result.remove(" ");
	result = result.remove("Size=");

	qint64 rv = 0;
	QStringList listT;
	QStringList resultList = result.split('\n', QString::SkipEmptyParts);
	for (int i = 0; i < resultList.count(); i++)
	{
		if (resultList.at(i) != "")
		{
			listT.append(resultList.at(i));

		}
	}
	return listT;
}

/**********************************************************
*函数名:获取磁盘容量函数
*功  能:获取磁盘容量
*输  入:无
*输  出:返回 QStringList:磁盘容量列表
***********************************************************/
QStringList CheckSerialNumber::getDiskV()
{
	QProcess p(0);
	p.start("wmic DiskDrive get Size /value");
	p.waitForStarted();
	p.waitForFinished();
	QString result = "";
	result = p.readAll();
	result = result.remove("Size=");
	result = result.remove("\r");

	qint64 rv = 0;
	QStringList listT;
	QStringList resultList = result.split('\n', QString::SkipEmptyParts);
	for (int i = 0; i < resultList.count(); i++)
	{
		if (resultList.at(i) != "")
		{
			rv = resultList.at(i).toLongLong() / 1024 / 1024 / 1024;
			listT.append(QString::number(rv));

		}
	}
	return listT;
}

/**********************************************************
*函数名:退出槽函数
*功  能:退出程序
*输  入:无
*输  出:无
***********************************************************/
void CheckSerialNumber::on_closeBtn_clicked()
{
	this->close();
}

/**********************************************************
以下函数是为实现在无窗口边框情况下实现拖拽
***********************************************************/
void CheckSerialNumber::mousePressEvent(QMouseEvent* e)

{
	if (e->button() == Qt::LeftButton)
	{
		this->windowPos = this->pos();
		this->mousePos = e->globalPos();
		this->dPos = mousePos - windowPos;
		mBIsWindowMoveable = true;
	}
}

void CheckSerialNumber::mouseMoveEvent(QMouseEvent*e)
{
	if (mBIsWindowMoveable)
	{
		this->move(e->globalPos() - this->dPos);
	}
}

void CheckSerialNumber::mouseReleaseEvent(QMouseEvent* e)
{
	mBIsWindowMoveable = false;
}

效果图

 资源下载

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章