当前位置:编程学习 > C#/ASP.NET >>

在.NET2中引入winmm.dll获取系统声卡数,但是在VISTA下却获取为0.

使用VS2005做的WINDOWS程序,使用winmm.dll的waveOutGetNumDevs()获取,在2K,XP,2003系统下均可正确获得,但是在VISTA下却获取结果为0。但是系统中是有声卡的。
怎么办?
谢谢。 --------------------编程问答-------------------- 顶下! --------------------编程问答-------------------- 底层api变了吧 --------------------编程问答-------------------- 那怎么办,好像.NET中没有获取声卡的方法. --------------------编程问答-------------------- wmi应该可以的,帮你找了下

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
                ...{}
            }            
        }
 
    }
}

--------------------编程问答-------------------- 谢谢cnfixit.

我导入vista下的winmm.dll后就行了,vista下的winmm.dll版本是6.0 xp下的是5.0
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,