[转]python使用ctypes模块调用windowsapi获取系统版本

时间:2022-12-22 11:05:09
#coding: utf-8

import win32ui
import win32gui
import win32con
import win32api


#https://mail.python.org/pipermail/python-win32/2009-April/009078.html
'''
ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)
large, small = win32gui.ExtractIconEx("F:\\nginx\\nginx-1.13.0\\nginx.exe",0)
win32gui.DestroyIcon(large[0])


hdc = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
hbmp = win32ui.CreateBitmap()
hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_x )
hdc = hdc.CreateCompatibleDC()

hdc.SelectObject( hbmp )
hdc.DrawIcon( (0,0), small[0] )
hbmp.SaveBitmapFile( hdc, "save.bmp" )

print(large)
print(small)
'''

"通过调用Window API判断当前系统版本"
# 演示通过ctypes调用windows api函数.
#
作者已经知道python32能够实现相同功能
#
语句末尾加分号,纯属个人习惯
#
仅作部分版本判断,更详细的版本判断推荐系统OSVERSIONINFOEX结构体

import ctypes;

class OSINFO(ctypes.Structure):
_fields_
= [
(
"dwOSVersionInfoSize",ctypes.c_long),
(
"dwMajorVersion",ctypes.c_long),
(
"dwMinorVersion",ctypes.c_long),
(
"dwBuildNumber",ctypes.c_long),
(
"dwPlatformId",ctypes.c_long),
(
"szCSDVersion",ctypes.c_char*128)
];

def GetSystemVersionString():
kernel32
= ctypes.windll.LoadLibrary("kernel32.dll");
os
= OSINFO();
os.dwOSVersionInfoSize
= ctypes.sizeof(os);
if kernel32.GetVersionExA(ctypes.byref(os))==0:
return "Null Version";
if os.dwPlatformId==1: #windows 95/98/me
if os.dwMajorVersion==4 and os.dwMinorVersion==0:
verStr
= "windows 95";
elif os.dwMajorVersion==4 and os.dwMinorVersion==10:
verStr
= "windows 98";
elif os.dwMajorVersion==4 and os.dwMinorVersion==90:
verStr
= "windows me";
else:
verStr
= "unknown version";
elif os.dwPlatformId==2: #windows vista/server 2008/server 2003/xp/2000/nt
if os.dwMajorVersion==4 and os.dwMinorVersion==0:
verStr
= "windows nt 4.0";
elif os.dwMajorVersion==5 and os.dwMinorVersion==0:
verStr
= "windows 2000";
elif os.dwMajorVersion==5 and os.dwMinorVersion==1:
verStr
= "windows xp";
elif os.dwMajorVersion==5 and os.dwMinorVersion==2:
verStr
= "windows 2003";
elif os.dwMajorVersion==6 and os.dwMinorVersion==0:
verStr
= "windows vista"; # or 2008
elif os.dwMajorVersion>=0:
verStr
= "windows 7";
else:
verStr
= "unknown version";
else:
return "unknown Version";
return verStr+" build"+str(os.dwBuildNumber)+" "+str(ctypes.string_at(os.szCSDVersion))

if __name__ == "__main__":
print(GetSystemVersionString())

https://www.oschina.net/code/snippet_157181_13215