using System;

using System.Runtime.InteropServices;

namespace GetWindowsVersion

{

[ StructLayout( LayoutKind.Sequential )]

public class OSVersionInfo 

{

public int OSVersionInfoSize;

public int MajorVersion;

public int MinorVersion;

public int BuildNumber; 

public int PlatformId;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )] 

public String versionString;

}

[ StructLayout( LayoutKind.Sequential )] 

public struct OSVersionInfo2 

{

public int OSVersionInfoSize;

public int MajorVersion;

public int MinorVersion;

public int BuildNumber; 

public int PlatformId;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]

public String versionString;

}

public class LibWrap 

{

[ DllImport( "kernel32" )]

public static extern bool GetVersionEx( [In, Out] OSVersionInfo osvi );

[ DllImport( "kernel32", EntryPoint="GetVersionEx" )] 

public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi ); 

}

public class App

{

public static void Main()

{

Console.WriteLine( " Passing OSVersionInfo as class" );

OSVersionInfo osvi = new OSVersionInfo();

osvi.OSVersionInfoSize = Marshal.SizeOf( osvi );

LibWrap.GetVersionEx( osvi );



Console.WriteLine( "Class size: {0} Operation System : {1} Pack: {2}", osvi.OSVersionInfoSize, OpSysName(osvi.MajorVersion, osvi.MinorVersion,osvi.PlatformId),osvi.versionString);

Console.WriteLine("{0}", osvi.PlatformId);



Console.WriteLine( " Passing OSVersionInfo as struct" );

OSVersionInfo2 osvi2 = new OSVersionInfo2();

osvi2.OSVersionInfoSize = Marshal.SizeOf( osvi2 );

LibWrap.GetVersionEx2( ref osvi2 );

Console.WriteLine( "Static size: {0} Operation System : {1} Pack: {2}", osvi2.OSVersionInfoSize, OpSysName(osvi2.MajorVersion, osvi2.MinorVersion,osvi2.PlatformId),osvi2.versionString);



}

public static String OpSysName(int MajorVersion,int MinorVersion ,int PlatformId)

{

String str_opn =String.Format("{0}.{1}",MajorVersion,MinorVersion);

switch(str_opn)

{

case "4.0":

return win95_nt40(PlatformId);

case "4.10":

return "Windows 98";

case "4.90":

return "Windows Me";

case "3.51":

return "Windows NT 3.51";

case "5.0":

return "Windwos 2000";

case "5.1":

return "Windwos XP";

case "5.2":

return "Windows Server 2003 family";

default:

return "This windows version is not distinguish!";

}

}

public static String win95_nt40(int PlatformId)

{

switch(PlatformId)

{

case 1:

return "Windows 95";

case 2:

return "Windows NT 4.0";

default:

return "This windows version is not distinguish!";

}

}

}

}

转载:http://www.2cto.com/kf/200906/39061.html

使用GetVersionEx传递例如以下结构来获得此信息

typedef struct _OSVERSIONINFOEX { 

 DWORD dwOSVersionInfoSize;  

DWORD dwMajorVersion; 

 DWORD dwMinorVersion; 

 DWORD dwBuildNumber; 

 DWORD dwPlatformId;  

TCHAR szCSDVersion[128];  

WORD wServicePackMajor; 

 WORD wServicePackMinor;  

WORD wSuiteMask;  //此成员能够用来作为推断home 还是professional的根据

BYTE wProductType; 

 BYTE wReserved;

} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;



关于操作系统的其它的信息你都能够在此结构中找到,详细使用參见MSDN的帮助

不怎么用C#,现学现卖给你写了一段代码,(代码中有不合理的地方,自己參照改动,实在没用过C#)例如以下:



主要代码例如以下:

using System.Runtime.InteropServices;



上述结构在C#中定义例如以下:

[ StructLayout( LayoutKind.Sequential )]   

public class OSVersionInfo 

{


public int OSVersionInfoSize;

public int majorVersion; 

public int minorVersion;

public int buildNumber;

public int platformId;



[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]    

public String versionString;

public Int16  wServicePackMajor;  

public Int16  wServicePackMinor;  

public Int16  wSuiteMask;  

public Byte  wProductType;  

public Byte  wReserved;

}





public class GetSysApi

{

   [ DllImport( "Kernel32.dll" )]

   public static extern bool GetVersionEx( [In, Out] OSVersionInfo osvi );

}



private void button2_Click(object sender, System.EventArgs e)

{

   OSVersionInfo osvi = new OSVersionInfo();

   osvi.OSVersionInfoSize = Marshal.SizeOf( osvi );

  GetSysApi.GetVersionEx(osvi);

  string tm = osvi.buildNumber+osvi.majorVersion+osvi.minorVersion+

      osvi.platformId +osvi.versionString+osvi.wProductType+

      osvi.wReserved+osvi.wSuiteMask;

   MessageBox.Show(tm);//依据那些成员变量,有足够的信息够你对操作系统进行推断

  //我这里仅仅写了你需求的关于windows xp professional或者windows xp home的推断

  if ( osvi.wProductType == 1)

  {

    if( osvi.majorVersion == 4 )

     MessageBox.Show( "Workstation 4.0 ");

    else if(( osvi.wSuiteMask & 512 )!=0) 

      MessageBox.Show("Win Xp Home Edition " );

    else MessageBox.Show("Win Xp Professional " );

   }



}



来自:http://bbs.csdn.net/topics/90504765

C#如何获得 WINDOWS 版本号的更多相关文章

  1. 超具体Windows版本号编译执行React Native官方实例UIExplorer项目(多图慎入)

    ),React Native技术交流4群(458982758).请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客右側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  2. 开源企业IM-免费企业即时通讯-ENTBOOST V2014.183 Windows版本号正式宣布

    ENTBOOST,VERSION 2014.183 Windows(点击下载)版本号公布.主要添加PC端P2P(点对点)文件传输功能:公布安卓Android手机clientAPP 1.0版本号.公布苹 ...

  3. 推断Windows版本号新方法

    曾经在代码中推断用户的Windows操作系统版本号都是通过GetVersion或GetVersionEx获取版本号号,然后比較. 今天偶然发如今新的Visual Studio提供了新的函数来推断系统版 ...

  4. 获取windows版本号

    原文:https://blog.csdn.net/justFWD/article/details/44856277 内容整理如下,点击跳至指定内容: manifest文件加上compatibility ...

  5. 查看Windows版本号

    1.Win+R,在运行中输入:msinfo32 2.在cmd中输入:ver 3.注册表(regedit)中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows ...

  6. 开源企业IM-免费企业即时通讯-ENTBOOST V2014.180 Windows版本号正式公布

    ENTBOOST,VERSION 2014.180 Linux版本号公布,主要添加企业IM应用集成功能,完好安卓SDK功能及部分BUG修正. 下一版本号公布时间.7月15日.敬请关注. ENTBOOS ...

  7. 开源企业IM-免费企业即时通讯-ENTBOOST V2014.177 Windows版本号正式公布

    ENTBOOST,VERSION 2014.177 LINUX 版本号公布.主要添加Android安卓手机开发接口.企业IM接口,JQUERY开发接口,PCclient部分BUG修正: 下版本号更新时 ...

  8. 显示Windows版本号

    实现效果: 知识运用: PaintDesktopVersion键 实现代码: private void button1_Click(object sender, EventArgs e) { Regi ...

  9. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布

    经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...

随机推荐

  1. win7下硬盘安装win7+CentOS双系统方法

    原文:win7下硬盘安装win7+CentOS双系统方法 LinuxCentOS安装大致介绍: win7下硬盘安装win7+CentOS双系统方法 原则: 所有的看完在装,请仔细看 一 条件: 1. ...

  2. 【VBA研究】查找目录以下全部文件的名称

    作者:iamlaosong 目录里面保存有面单扫描的图像文件,文件名称为邮件号码.如今想收集这些邮件号码,由于量非常大,不可能一个一个的截取,仅仅能通过程序实现.假定,当前工作表B列里放的是存放这些图 ...

  3. LeetCode_Merge Two Sorted Lists

    一.题目 Merge Two Sorted Lists My Submissions Merge two sorted linked lists and return it as a new list ...

  4. Unix Domain Socket 域套接字实现

    主要注意流程: STREAM SOCKET: Server :  socket() --->  bind() ---> listen()  ---> accept() Client: ...

  5. poj3662(二分+最短路)

    题目连接:http://poj.org/problem?id=3662 题意:有n个节点p条无向边,现在可以选择其中的任意K条免费,则花费为除了k条边后权值最大的一个,求最小花费多少. 分析:二分枚举 ...

  6. leetcode - Pascal's Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  7. 完美攻略心得之圣魔大战3(Castle Fantisia)艾伦希亚战记(艾伦西亚战记)包含重做版(即新艾伦希亚战记)

    (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...

  8. HttpMime 处理 多部件 POST 请求

    HttpMime 处理 多部件 POST 请求 在有的场合例如我们要用到上传文件的时候,就不能使用基本的GET请求和POST 请求了,我们要使用多部件的POST请求.由于Android 附带的 Htt ...

  9. vi 按了ctrl+s之后

    再windows不管是写程序.还是用Word写文件.已经习惯了按ctrl+s 保存代码. 在用vi的时候.常常无意中按了ctrl+s,结果就是如同终端死掉了一样. 这是由于ctrl+s 终止屏幕输出( ...

  10. Spring in action(Spring实战) 第四版中文翻译

    第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...