2009-06-18 16 views
14

¿Cómo verificar el tipo de máquina actual? computadora portátil o de escritorio?¿Cómo verificar el tipo de máquina? computadora portátil o de escritorio?

Obtuve esto de http://blog.csdn.net/antimatterworld/archive/2007/11/11/1878710.aspx, funciona bien en mi máquina doméstica (Win2003 en la computadora portátil), devuelve "Portátil", pero falló en mi máquina de trabajo (Vista en la computadora portátil), devuelve "Otro".

Aquí está el código:


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

interesante. ¿Qué está tratando de lograr? ¿Está tratando de determinar si es probable que la máquina se use fuera de la oficina? –

+0

estoy con John Saunders: ¿qué estás tratando de lograr? Existe una forma confiable de verificar si la máquina funciona con batería: ¿es eso lo que espera averiguar al preguntarle a la computadora portátil o no? –

+4

No hay una métrica confiable para determinar qué factor de forma es un sistema; además, no tiene manera de determinar qué factores de forma futura podrían 'parecer' como un dispositivo portátil actual con cualquier métrica específica. La verdadera pregunta aquí es por qué el factor de forma del sistema en el que se está ejecutando su código es importante. –

Respuesta

-3

lectura clave de registro de HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ PCMCIA, el valor de 'Inicio', que es portátil si start = 0, de lo contrario es máquina de escritorio si inicio no existe o empezar! = 0.

+0

Estoy usando Windows 7 Professional en VAIO VPCCW2DGX/B y el valor de inicio es 3 !! esta respuesta no es precisa. –

+1

¿Qué pasa si mi computadora portátil no tiene PCMCIA? ¿O mi escritorio delgado? –

+1

Mi sistema de escritorio tiene una tarjeta PCI PCMCIA, ¿eso lo convierte en una computadora portátil? –

2

No creo que haya una respuesta correcta definitiva para esto y he encontrado que WMI no es confiable pero he estado usando la función Win32 GetSystemPowerStatus() para determinar si hay una batería del sistema, obviamente batería del sistema = = computadora portátil.

¡Nunca lo he intentado en una computadora de escritorio con una UPS!

7

He aquí un buen artículo de Microsoft que sugiere ver algunas otras clases WMI para obtener una mejor idea de si el equipo es un equipo portátil o de escritorio:
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 

Y también sugiere que mirar en el registro para el esquema de Poder.

3

Bueno, puede que intente criar a los muertos aquí, pero sugeriría que el método más confiable para determinar una computadora portátil sería el presente de un interruptor de estado de tapa. Ver GetPwrCapabilities y System_power_Capabilities

3

No hay necesidad de que tanto Otros y Desconocido cheque.

Cambia la condición a i > 1 && i < 25 y recuerda ChassisTypes es una matriz donde OS devuelve lo que él crea que es tu sistema.

Es posible hacer coincidir más de un tipo. Tu código solo devuelve la primera coincidencia.

0

Para comprobar si la máquina es portátil o de escritorio, puede intentar verificar el estado de la batería, utilizando SystemPowerCapabilites.LidPresent o ambos.

batería:

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 definición: http://www.pinvoke.net/default.aspx/powrprof/GetPwrCapabilities.html

Cuestiones relacionadas