電腦內存硬盤查看器(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;
}

效果圖

 資源下載

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