Come controllare il tipo di macchina? laptop o desktop?

Come verificare il tipo di macchina corrente? laptop o desktop?

L’ho ottenuto da http://blog.csdn.net/antimatterworld/archive/2007/11/11/1878710.aspx , funziona bene sulla mia macchina domestica (Win2003 su laptop), restituisce “Portatile”, ma non è riuscito la mia macchina da lavoro (Vista sul laptop), restituisce “Altro”.

ecco il codice:

public enum ChassisTypes { Other = 1, Unknown, Desktop, LowProfileDesktop, PizzaBox, MiniTower, Tower, Portable, Laptop, Notebook, Handheld, DockingStation, AllInOne, SubNotebook, SpaceSaving, LunchBox, MainSystemChassis, ExpansionChassis, SubChassis, BusExpansionChassis, PeripheralChassis, StorageChassis, RackMountChassis, SealedCasePC } public static ChassisTypes GetCurrentChassisType() { ManagementClass systemEnclosures = new ManagementClass("Win32_SystemEnclosure"); foreach (ManagementObject obj in systemEnclosures.GetInstances()) { foreach (int i in (UInt16[ ])(obj["ChassisTypes"])) { if (i > 0 && i < 25) { return (ChassisTypes)i; } } } return ChassisTypes.Unknown; } 

Ecco un buon articolo di Microsoft che suggerisce di esaminare alcune altre classi WMI per avere un’idea migliore del fatto che il computer sia un laptop o un desktop:
http://technet.microsoft.com/en-us/library/cc180825.aspx

 Win32_SystemEnclosure, ChassisTypes(1)=10 Win32_Battery or Win32_PortableBattery Win32_PCMCIAController Win32_DriverVXD.Name = "pccard" Win32_ComputerSystem.Manufacturer Win32_ComputerSystem.Model 

E suggerisce anche di cercare nel registro il programma di risparmio energia.

Beh, potrei tentare di resuscitare i morti qui, ma suggerirei che il metodo più affidabile per determinare un laptop sarebbe il presente di un interruttore dello stato del coperchio. Vedi GetPwrCapabilities e System_power_Capabilities

Non è necessario il controllo Altro e Sconosciuto .

Cambia la condizione in i > 1 && i < 25 e ricorda ChassisTypes è un array in cui il sistema operativo restituisce ciò che pensa sia il tuo sistema.

È ansible abbinare più di un singolo tipo. Il tuo codice restituisce solo la prima partita.

Vedere http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/hey0921.mspx e http://msdn.microsoft.com/en-us/library/aa387204(VS.85).aspx che afferma che:

Questa documentazione è derivata dalle descrizioni delle classi CIM pubblicate dal DMTF.

Presumibilmente, ciò significa che il produttore doveva fornire alcune informazioni affinché Windows potesse scoprirlo.

Non penso che ci sia una risposta definitiva definitiva per questo e ho trovato WMI inaffidabile per questo, ma ho utilizzato la funzione Win32 GetSystemPowerStatus () per determinare se c’è una batteria di sistema, ovviamente batteria di sistema == computer portatile.

Non l’ho mai provato su un desktop con un UPS però ?!

Sono abbastanza sicuro che ciò dipenderà dal fatto che il produttore si sia preso la briga di fornire i dati sul chipset corrente. Se non lo fanno, allora “Altro” è il meglio che puoi fare.

Dai un’occhiata a questo articolo in qualche modo correlato , che suggerisce anche di interrogare direttamente il BIOS .

Per verificare se la macchina è portatile o desktop, puoi provare a controllare lo stato della batteria, utilizzando SystemPowerCapabilites.LidPresent o entrambi.

Batteria:

 if(SystemInformation.PowerStatus.BatteryChargeStatus ==BatteryChargeStatus.NoSystemBattery){ //desktop } else{ //laptop } 

SystemPowerCapabilites.LidPresent:

 public SYSTEM_POWER_CAPABILITIES getSystemPowerCapabilites(){ { SYSTEM_POWER_CAPABILITIES systemPowerCapabilites; GetPwrCapabilities(out systemPowerCapabilites); return systemPowerCapabilites; } getSystemPowerCapabilites().LidPresent; 

Definizione GetPwrCapabilities: http://www.pinvoke.net/default.aspx/powrprof/GetPwrCapabilities.html

leggere la chiave di registro da HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ pcmcia, il valore ‘Start’, è laptop se start = 0, altrimenti è computer desktop se start non esiste o start! = 0.