在.NET2中引入winmm.dll获取系统声卡数,但是在VISTA下却获取为0.
使用VS2005做的WINDOWS程序,使用winmm.dll的waveOutGetNumDevs()获取,在2K,XP,2003系统下均可正确获得,但是在VISTA下却获取结果为0。但是系统中是有声卡的。怎么办?
谢谢。 --------------------编程问答-------------------- 顶下! --------------------编程问答-------------------- 底层api变了吧 --------------------编程问答-------------------- 那怎么办,好像.NET中没有获取声卡的方法. --------------------编程问答-------------------- wmi应该可以的,帮你找了下
--------------------编程问答-------------------- 谢谢cnfixit.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Management;
using System.Text;
namespace WindowsApplication2
...{
/**//**//**//**//**//**//**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
...{
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader name;
private System.Windows.Forms.ColumnHeader caption;
private System.Windows.Forms.ColumnHeader desc;
private System.Windows.Forms.MenuItem menuItem1;
/**//**//**//**//**//**//**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
...{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
this.getnetwork();
this.getvideo();
this.getsound();
this.getcpu();
this.getmemory();
this.getmainboard();
}
//得到硬件的信息集合
public ManagementObject dosth(string[] hstra)
...{
string hname=hstra[0];
ManagementObjectSearcher query = new ManagementObjectSearcher(hstra[1]);
ManagementObjectCollection qc = query.Get();
foreach( ManagementObject obj in qc)
...{
switch(hname)
...{
case "网卡":
if((bool)obj["ipEnabled"]==false)
continue;
//this.getallinfo(obj);
string cap=(string)obj["Caption"];
string tmp=cap.Substring(1,8);
if(int.Parse(tmp)>100)
continue;
return obj;
case "显卡":
return obj;
case "声卡":
return obj;
case "CPU":
return obj;
case "内存":
return obj;
case "主板":
return obj;
}
}
return null;
}
//得到主板的信息
public void getmainboard()
...{
string mosstr="select * from Win32_BaseBoard";
string[] hstra=...{"主板",mosstr};
ManagementObject obj=this.dosth(hstra);
this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
}
//得到内存的信息
public void getmemory()
...{
string mosstr="select * from Win32_PhysicalMemory";
string[] hstra=...{"内存",mosstr};
ManagementObject obj=this.dosth(hstra);
//this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
int memsize=int.Parse(obj["Capacity"].ToString())/(1024*1024);
string []stra=...{hstra[0],obj["Name"].ToString(),memsize.ToString()+"M"};
this.filllist(stra);
}
//得到CPU的信息
public void getcpu()
...{
string mosstr="select * from Win32_Processor";
string[] hstra=...{"CPU",mosstr};
ManagementObject obj=this.dosth(hstra);
//this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
float fs=float.Parse(obj["CurrentClockSpeed"].ToString())/1000;
string[] stra=...{hstra[0],obj["Name"].ToString(),fs.ToString()+"G"};
this.filllist(stra);
}
//得到声卡的信息
public void getsound()
...{
string mosstr="select * from Win32_SoundDevice";
string[] hstra=...{"声卡",mosstr};
ManagementObject obj=this.dosth(hstra);
//this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
string[] stra=...{hstra[0],(string)obj["Caption"]};
this.filllist(stra);
}
//得到网卡的信息
public void getnetwork()
...{
string mosstr="SELECT * From Win32_NetworkAdapterConfiguration";
string[] hstra=...{"网卡",mosstr};
ManagementObject obj=this.dosth(hstra);
//this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
string[] ipadd = (string[])obj["IPAddress"];
System.Text.StringBuilder sb=new StringBuilder();
foreach(string str in ipadd)
...{
sb.Append(str);
}
string[] stra=...{hstra[0],(string)obj["Caption"],sb.ToString()};
this.filllist(stra);
}
//得到显卡信息
public void getvideo()
...{
string mosstr="select * from Win32_VideoController";
string[] hstra=...{"显卡",mosstr};
ManagementObject obj=this.dosth(hstra);
//this.getallinfo(obj);//先用这个命令取出所有的信息,然后再挑选其中所需要的!
int ramsize=(int.Parse(obj["AdapterRAM"].ToString()))/(1024*1024);
string[] stra=...{hstra[0],(string)obj["Caption"],ramsize.ToString()+"M"};
this.filllist(stra);
}
//枚举当前设备所有能显示的信息
public void getallinfo(ManagementObject obj)
...{
System.Management.PropertyDataCollection pdc=obj.Properties;
foreach(PropertyData pd in pdc)
...{
try
...{
string []stra=...{pd.Name,pd.Value.ToString()};
this.filllist(stra);
}
catch
...{}
}
}
}
}
我导入vista下的winmm.dll后就行了,vista下的winmm.dll版本是6.0 xp下的是5.0
补充:.NET技术 , C#