電腦內存硬盤查看器[序列號和容量](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;
}
效果圖
資源下載
- Python源碼下載(碼雲下載)
- C++源碼下載(碼雲下載)
- Python版本應用下載(碼雲下載 )
- C++版本應用下載(碼雲下載)