2009-06-18 6 views
14

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

Ho ottenuto questo 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 sulla 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; 
} 
 
+4

Interessante. Cosa stai cercando di realizzare? Stai solo cercando di determinare se è probabile che la macchina venga utilizzata al di fuori dell'ufficio? –

+0

sono con John Saunders: cosa stai cercando di ottenere? Esiste un modo affidabile per verificare se la macchina è alimentata da una batteria: è questo che speri di scoprire chiedendo al laptop o no? –

+4

Non esiste una metrica affidabile per determinare quale fattore di forma è un sistema; inoltre, non è possibile determinare quali futuri fattori di forma potrebbero "sembrare" come un dispositivo portatile attuale in base a parametri specifici. La vera domanda qui è perché sulla terra è il fattore di forma del sistema su cui è in esecuzione il tuo codice importante? –

risposta

-3

lettura chiave di registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ pcmcia, il valore 'Start', è portatile, se inizio = 0, altrimenti è macchina desktop se inizio non esiste o iniziare! = 0.

+0

Utilizzo Windows 7 Professional su VAIO VPCCW2DGX/B e il valore iniziale è 3 !! questa risposta non è accurata –

+1

Cosa succede se il mio portatile non ha PCMCIA? O il mio desktop slim-line lo fa? –

+1

Il mio sistema desktop ha una scheda PCI PCMCIA - questo lo rende un laptop? –

2

Non penso che ci sia una risposta definitiva definitiva per questo e ho trovato WMI inaffidabile ma ho usato 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ò ?!

7

Ecco un buon articolo di Microsoft che suggerisce di guardare alcune altre classi WMI per ottenere una migliore idea di se il computer è un computer portatile o 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 a guardare nel registro per lo schema di alimentazione.

3

Beh, potrei tentare di resuscitare 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

3

Non è necessario sia per Unknown controllo Altro e .

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

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

0

Per verificare se la macchina è portatile o desktop, è possibile 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; 

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