保留那一个成员是为了向从前版本的Windows,其窗口类名为

  SYSTEM_INFO结构体包涵了脚下计算机的音讯。这几个音信包涵电脑的系统布局、中心处理器的品种、系统中中心处理器的数额、页面的大大小小以及任何消息。

本文由lanyus从《奇思异想编程之DELPHI篇》收集整理,转发请评释此处。

用作初学者来说,在C#中使用API确是一件令人高烧的难点。在应用API往日你必须了解怎么在C#中行使结构、类型转换、安全/不安全代码,可控/不可控代码等诸多文化。

SYSTEM_INFO,Win32 API函数GetSystemInfo所使用的结构体。

一、隐藏职务栏
在WINDOWS中,系统的职务栏本质上也是一个窗口,其窗口类名为“Shell_TrayWnd”。要贯彻对它的操作,可透过API函

  一切从简单伊始,复杂的门阀一时不可能经受。大家就从已毕一个简易的MessageBox发轫。首先打开VS.Net
,成立一个新的C#工程,并加上一个Button按钮。当这么些按钮被点击,则浮现一个MessageBox对话框。

typedef struct _SYSTEM_INFO { // sinf

数FindWindow和

即然我们要求引用外来库,所以必须导入一个Namespace:

  union {

ShowWindow来达到目标。

using
System.Runtime.InteropServices;

    DWORD
dwOemId;      已放任的成员,保留那么些成员是为了向之前版本的Windows
NT保持相当。从Windows NT3.51和Windows
95的预发行版本初始,使用这一个成员的子分支wProcessorArchitecture。

var
wndHandle:THandle;
wndClass:Array[0..50] of char;
begin
StrPCopy(@wndClass[0],Shell_TrayWnd);
wndHandle:=FindWindow(@wndClass[0],nil);
ShowWindow(wndHandle,SW_HIDE);   //sw_restore
end;

继而添加上边的代码来声称一个API:

                    Windows
95:系统总是把那个成员的值设为0,也就是PROCESSOR_ARCHITECTURE_INTEL的约定义值。

二、隐藏桌面上的快速格局
跟职分栏一样,桌面其实也是一个窗口,它的类名为“ProgMan”,同样用FindWindow找到窗口句柄,再邮ShowWindow

[DllImport(“User32.dll”)]
  public static
extern int MessageBox(int h, string m, string c, int type);

    struct {

来控制是或不是出示。

此间DllImport属性被用来从不足控代码中调用一主意。”User32.dll”则设定了类库名。DllImport属性指定dll的地点,那一个dll中概括调用的外表方法。Static修饰符则声爱他美(Nutrilon)个静态元素,而以此元素属于类型我而不是上边点名的对象。extern则意味着那些措施将在工程外部执行,使用DllImport导入的办法必须使用extern修饰符。
     MessageBox 则是函数名,拥有4个参数,其再次来到值为数字。

        WORD
wProcessorArchitecture;    指定系统中的要旨处理器的种类布局,可以是之类的值:

三、获取职务栏尺寸及地方
用FindWindow找到句柄,再用GetWindowRect获取当前职务栏尺寸大小。
GetWindowRect(HWND hWnd,    //所求窗口的句柄
              LPRECT lpRect   //存储窗口坐标的结构体的地点
             ):Boolean;

     一大半的API都能传递并重临值。

        WORD wReserved;          保留供未来使用。

四、获取CPU信息
CPU的有关信息是储存在一个结构体中的,那么些结构体由DELPHI用TSYSTEMINFO举办了包装,定义如下:
typedef struct_SYSTEM_INFO{
  union{
 DWORD dwOemId;                   
//已改用如下结构体分支来代替这些变量的运用了
        struct{
            WORD wProcessorArchitecture; //表示处理器的架构
            word wReserved;        //保留字
        };
   };
 DWORD swPageSiae;            //分页大小
 LPVOID
lpMinimumApplicationAddress;   //应用程序和动态链接库可以访问的小不点儿地址
 LPVOID
lp马克斯imumApplicationAddress;   //应用程序和动态链接库可以访问的最大地点
 DWORD  swActiveProcessorMask;      //活动处理器的掩码
 DWORD  dwNumberOfProcessors;       //处理器的多少
 DWORD  dwProcessorType;         //处理器的花色
 DWORD  dwAllocationGranularity;     //虚拟内存地址分配的间隔
 WORD   wProcessorLevel;         //处理器的级别
 WORD   wProcessorRevision;       //处理器修改新闻
 }SYSTEM_INFO;
中间dwProcessorType由wProcessorArchitecture、wProcessorLevel和wProcessorRevision四个成员来规定,其值为:
  PROCESSOR_INTEL_386:INTEL80386系列;
  PROCESSOR_ITNEL_486:INTEL80486系列;
  PROCESSOR_INTEL_PENTIUM:INTEL PENTIUM系列;
  PROCESSOR_MIPS_R4000:MIPS的4000多元(仅适用于WINDOWS NT);
  PROCESSOR_ALPHA_21064:ALPHA的21064比比皆是(仅适用于WINDOWS NT);

     添中Click点击事件代码:

      };

除此以外,得到CPU音信调用API函数GetSystemInfo即可。

  protected
void button1_Click(object sender, System.EventArgs e)
{
MessageBox (0,”API Message Box”,”API Demo”,0);
}

    };

五、获取内存信息。
与收获CPU一样,系统依然选择了一个结构体来存储内存音信。这几个蕴藏内在状态新闻的体定义下如:
typedef struct_MEMORYSTATUS{
 DWORD dwLength;            //SIZEOF(MEMORYSTATUS)即本结构体的轻重缓急
 DWORD dwMemoryLoad;        //当前应用内存与总内在的比重
 DWORD dwTotalPhys;     //总物理内存大小
 DWORD dwAvailPhys;     //可用物理内存大小
 DWORD dwTotalPageFile;   //总页面文件的分寸
 DWORD dwAvailPageFile;   //可用页面文件的高低
 DWORD dwTotalVirtual;    //总虚拟内存的大大小小
 DWORD dwAvailVirtual;    //可用虚拟内存的深浅
}MEMORYSTATUS,*LPMEMORYSTATUS;

编译并运行那几个顺序,当您点击按钮后,你将会看到对话框,那便是您使用的API函数。
   
利用结构体
    操作带有结构体的API比选择简便的API要复杂的多。不过如果您控制了API的进度,这一个所有API世界将在你的支配其中。

    DWORD dwPageSize;              
指定页面的高低和页面尊崇和委托的颗粒。那是被 VirtualAlloc
函数使用的页大小。

最后调用API函数GlobalMemoryStatus来赢得内存新闻。

    下边的例子中大家将应用GetSystemInfo
API 来获得整个体系的音讯。

    LPVOID
lpMinimumApplicationAddress;      指向应用程序和动态链接库(DLL)可以访问的最低内存地址。

六、获取磁盘空间大小。   (测试发现不准)
使用API函数GetDiskFreeSpace。
BOOL GetDiskFreeSpace(
 LPCTSTR lpRootPathName,           //根目录
 LPDWORD lpSectorsPerCluster,   //每簇的扇区数
 LPDWORD lpBytesPerSector,     //每个扇区的字节数
 LPDWORD lpNumberOfFreeClusters,  //可用的簇数
 LPDWORD lpTotalNumberOfClusters  //总簇数
 );
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Secspclu,Bytespsec,Freeclu,Totalclu,Ts,Fs:DWORD;
begin
GetDiskFreeSpace(c:,Secspclu,Bytespsec,Freeclu,Totalclu);
Fs:=Freeclu*Secspclu*Bytespsec;
Ts:=Totalclu*Secspclu*Bytespsec;
Edit1.text:=FormatFloat(###,###,Ts); //总空间
Edit2.text:=FormatFloat(###,###,Fs);  //可用空间
end;

    第一步仍然打开C#创建一个Form工程,同样的添中一个Button按钮,在代码窗中输入上边的代码,导入Namespace:

    LPVOID
lp马克斯imumApplicationAddress;      指向应用程序和动态链接库(DLL)能够访问的万丈内存地址。

七、限制鼠标移动范围。
WINDOWS里有一个现成的API函数ClipCursor可以界定光标移动区域。
BOOL ClipCursor(
     CONST RECT *lpRect    //指向一个仓储矩形范围数据的结构体
     );
有了那个函数就足以限制光标在显示器的活动范围了。不过,即使想操纵鼠标在某窗口的稳定范围内活动,则需求调用咖

using
System.Runtime.InteropServices;

    DWORD
dwActiveProcessorMask;        指定一个用来表示这一个连串中装配了的中心处理器的掩码。二进制0位是拍卖器0;31位是总计机31。

一个函数

声明一个结构体,它将用作GetSystemInfo的一个参数:

    DWORD
dwNumberOfProcessors;        指定系统中的处理器的多寡。

MapWindowPoints,它可以将一个窗体的坐标转化为另一个连锁的窗体坐标。

 [StructLayout(LayoutKind.Sequential)]

    DWORD dwProcessorType;

http://www.bkjia.com/Delphijc/531402.htmlwww.bkjia.comtruehttp://www.bkjia.com/Delphijc/531402.htmlTechArticle本文由lanyus从《奇思异想编程之DELPHI篇》收集整理,转载请注明此处。
一、隐藏职务栏 在WINDOWS中,系统的任务栏本质上也是一个窗口,其…

public struct SYSTEM_INFO

    DWORD dwAllocationGranularity;

{

    WORD wProcessorLevel;

public uint dwOemId;
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}

    WORD wProcessorRevision;

声明API函数:

  } SYSTEM_INFO;

[DllImport(“kernel32”)]
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

 

添加底下的代码至按钮的点击事件处理中:

wProcessorArchitecture:
指定系统中的中心处理器的系统布局,可以是之类的值:
PROCESSOR_ARCHITECTURE_INTEL
只适用于Windows NT: PROCESSOR_ARCHITECTURE_MIPS
只适用于Windows NT: PROCESSOR_ARCHITECTURE_ALPHA
只适用于Windows NT: PROCESSOR_ARCHITECTURE_PPC
只适用于Windows NT: PROCESSOR_ARCHITECTURE_UNKNOWN

率先成立一个SYSTEM_INFO结构体,并将其传递给GetSystemInfo函数。

dwProcessorType:
    Windows 95:
        指定系统中中心处理器的项目。
    Windows NT:
        那几个成员已经不复灵光了,不过为了向Windows
95和之前版本的Windows NT保持十分,使用wProcessorArchitecture,

 protected void button1_Click (object sender,
System.EventArgs e)
{
   try
{
SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
//
//
//  

 

//一旦您收到到再次回到的结构体,那么就足以以回到的参数来进行操作了。

wProcessorLevel, 和 wProcessorRevision 多少个成员定义处理器的体系。
  那些成员的值是底下中的一个:
  PROCESSOR_INTEL_386
  PROCESSOR_INTEL_486
  PROCESSOR_INTEL_PENTIUM
  只适用于Windows NT: PROCESSOR_MIPS_R4000
  只适用于Windows NT: PROCESSOR_ALPHA_21064

 e.g.listBox1.InsertItem
(0,pSI.dwActiveProcessorMask.ToString());:
//
//
//
}
     catch(Exception er)

 

     {
     MessageBox.Show (er.Message);
              }
 }

dwAllocationGranularity:
    指定已经被分配的虚拟内存空间的粒度。例如,借使应用VirtualAlloc函数请求分配1byte内存空间,那么将会保留由

 //Created By Ajit Mungale

 


**
//程序补充   苍马之子**

dwAllocationGranularity指定大小byte的地方空间。在过去,那么些值被定为64K并定位在硬件中,可是任何的硬件系统布局可能须求其余的值。

新建多少个Form窗体:Mainform和about,在Mainform窗体中添加MenuStrip,然后添加子菜单abouttoolmenustrip,其它添加一个ListBox和Button。

 

using System;

wProcessorLevel:
Windows 95: 不利用这一个成员。
Windows NT: 指定系统系统布局依赖的总计机级别。
如果 wProcessorArchitecture 的值是 PROCESSOR_ARCHITECTURE_INTEL,那么
wProcessorLevel可以使如下值中的一个:
值 含义
3 Intel 80386
4 Intel 80486
5 Pentium
如果 wProcessorArchitecture 的值是 PROCESSOR_ARCHITECTURE_MIPS,那么
wProcessorLevel
的值会是00xx的情势,xx是一个8位的立时数。那些成员能够使如下的值:
值 含义
0004 MIPS R4000
如果 wProcessorArchitecture 的值是 PROCESSOR_ARCHITECTURE_ALPHA, 那么
wProcessorLevel
的值会是xxxx的格局,xxxx是一个16位的拍卖器版本数(固件中版本号的低16位),它的值可以是下表中的一个:
十进制值 含义
21064 Alpha 21064
21066 Alpha 21066
21164 Alpha 21164
如果 wProcessorArchitecture 的值是 PROCESSOR_ARCHITECTURE_PPC, 那么
wProcessorLevel
的值会是xxxx的款型,xxxx是一个16位的处理器版本数(处理器版本寄存器的高16位),它的值可以使下表中的一个:
十进制值 含义
1 PPC 601
3 PPC 603
4 PPC 604
6 PPC 603+
9 PPC 604+
20 PPC 620
wProcessorRevision:
Windows 95: 不行使这些成员。
Windows NT:
指定系统系统布局信赖的微处理器修订版本号。下表突显了对于每一种处理器种类,处理器的核对版本号是什么样整合的。
计算机种类 值
AMD 80386 or 80486 类似xxyz的款式。若是xx等于0xFF,y-0xA 是型号,z
是步进表示符。例如,一个英特尔 80486-D0 CPU 组成的种类重返0xFFD0。
固然xx不等于0xFF,’A’是步进表示符,yz 是帮助步进表示符。
速龙 Pentium, Cyrix, or NextGen 586
类似xxyy的款型。xx是型号,yy是步进值。例如,一个0x0201的值表明那是一个Model
2,Stepping 1的CPU。
MIPS 类似00xx的款型。xx是8位的总计机修订号(PRId寄存器的低8位)。
ALPHA
类似xxyy的款型。xxyy是电脑固件中的修订号的低16位。那几个值被展现成这几个样子:Model
‘A’+xx, yy被忽略。
PPC
类似xxyy的款型。xxyy是总计机版本寄存器的低16位。这么些值被出示为固定小数:xx.yy
注释:
从Windows NT 3.51和Windows
95的预发行版本开端,SYSTEM_INFO结构发生了如下变化:
·dwOemId 成员被更改成一个结构。这些结构提供了一条新的可以用来讲述Windows
NT处理器系列布局的路,同时保持了与Windows 95 以及Windows
NT以前版本的包容性。
·dwProcessorType 成员在Windows NT系统上已经被抛弃,但是仍在Windows
95种类中选取。
·一个原先封存的放在结构末端的双字值被wProcessorLevel 和
wProcessorRevision 五个成员代表。Windows 95 不使用那四个分子。

using
System.Collections.Generic;

using
System.ComponentModel;

using
System.Data;

using
System.Drawing;

using
System.Text;

using
System.Windows.Forms;

using
System.Runtime.InteropServices;

 

namespace WINAPI

{

    //Struct
收集体系新闻

   
[StructLayout(LayoutKind.Sequential)]

    public struct
SYSTEM_INFO

    {

        public uint
dwOemId;

        public uint
dwPageSize;

        public uint
lpMinimumApplicationAddress;

        public uint
lpMaximumApplicationAddress;

        public uint
dwActiveProcessorMask;

        public uint
dwNumberOfProcessors;

        public uint
dwProcessorType;

        public uint
dwAllocationGranularity;

        public uint
dwProcessorLevel;

        public uint
dwProcessorRevision;

    }

    //struct
收集内存情状

   
[StructLayout(LayoutKind.Sequential)]

    public struct
MEMORYSTATUS

    {

        public uint
dwLength;

        public uint
dwMemoryLoad;

        public uint
dwTotalPhys;

        public uint
dwAvailPhys;

        public uint
dwTotalPageFile;

       public uint
dwAvailPageFile;

        public uint
dwTotalVirtual;

        public uint
dwAvailVirtual;

    }

 

 

    public partial class
Form1 : Form

    {

        //获取系统音讯

       
[DllImport(“kernel32”)]

        static extern
void GetSystemInfo(ref SYSTEM_INFO pSI);

        //获取内存新闻

       
[DllImport(“kernel32”)]

        static extern
void GlobalMemoryStatus(ref MEMORYSTATUS buf);

        //处理器类型

        public const int
PROCESSOR_INTEL_386 = 386;

        public const int
PROCESSOR_INTEL_486 = 486;

        public const int
PROCESSOR_INTEL_PENTIUM = 586;

        public const int
PROCESSOR_MIPS_R4000 = 4000;

        public const int
PROCESSOR_ALPHA_21064 = 21064;

 

        public
Form1()

        {

           
InitializeComponent();

        }

 

        private void
aboutToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Form abt =
new about();

           
abt.ShowDialog();

        }

 

        private void
btn_display_Click(object sender, EventArgs e)

        {

            try

            {

               
SYSTEM_INFO pSI = new SYSTEM_INFO();

               
GetSystemInfo(ref pSI);

                string
CPUType;

                switch
(pSI.dwProcessorType)

                {

                    case
PROCESSOR_INTEL_386:

       
                CPUType = “Intel 386”;

                       
break;

                    case
PROCESSOR_INTEL_486:

                       
CPUType = “Intel 486”;

                       
break;

                    case
PROCESSOR_INTEL_PENTIUM:

           
            CPUType = “Intel Pentium”;

                       
break;

                    case
PROCESSOR_MIPS_R4000:

                       
CPUType = “MIPS R4000”;

                       
break;

                    case
PROCESSOR_ALPHA_21064:

           
            CPUType = “DEC Alpha 21064”;

                       
break;

                   
default:

                       
CPUType = “(unknown)”;

                       
break;

                }

               
listBox1.Items.Add(“Active Processor Mask :” +
pSI.dwActiveProcessorMask.ToString());

               
listBox1.Items.Add(“Allocation Granularity :” +
pSI.dwAllocationGranularity.ToString());

               
listBox1.Items.Add(“Number Of Processors :” +
pSI.dwNumberOfProcessors.ToString());

       
        listBox1.Items.Add(“OEM ID :” + pSI.dwOemId.ToString());

               
listBox1.Items.Add(“Page Size:” + pSI.dwPageSize.ToString());

               
listBox1.Items.Add(“Processor Level Value:” +
pSI.dwProcessorLevel.ToString());

               
listBox1.Items.Add(“Processor Revision:” +
pSI.dwProcessorRevision.ToString());

               
listBox1.Items.Add(“CPU type:” + CPUType);

               
listBox1.Items.Add(“Maximum Application Address: ” +
pSI.lpMaximumApplicationAddress.ToString());

   
            listBox1.Items.Add(“Minimum Application Address:” +
pSI.lpMinimumApplicationAddress.ToString());

               
/************** 从 GlobalMemoryStatus
获取重回值****************/

               
MEMORYSTATUS memSt = new MEMORYSTATUS();

             
  GlobalMemoryStatus(ref memSt);

               
listBox1.Items.Add(“Available Page File :” +
(memSt.dwAvailPageFile/1024).ToString());

               
listBox1.Items.Add(“Available Physical Memory : ” +
(memSt.dwAvailPhys/1024).ToString());

             
  listBox1.Items.Add(“Available Virtual Memory:” +
(memSt.dwAvailVirtual/1024).ToString());

               
listBox1.Items.Add(“Size of structur :” +
memSt.dwLength.ToString());

               
listBox1.Items.Add(“Memory In Use :” +
memSt.dwMemoryLoad.ToString());

               
listBox1.Items.Add(“Total Page Size :” +
(memSt.dwTotalPageFile/1024).ToString());

               
listBox1.Items.Add(“Total Physical Memory :” +
(memSt.dwTotalPhys/1024).ToString());

               
listBox1.Items.Add(“Total Virtual Memory :” +
(memSt.dwTotalVirtual/1024).ToString());

            }

            catch
(Exception er)

            {

               
MessageBox.Show(er.Message);

            }

        }

    }

}

相关文章