Entwickler-Ecke

Windows API - "Notebook oder Desktop-PC?"-Überprüfung


TheHuette - Mo 18.06.07 10:00
Titel: "Notebook oder Desktop-PC?"-Überprüfung
Hi!
Ich suche eine Möglichkeit eindeutig herausfinden zu können, ob es sich beim ausführenden PC um ein Notebook oder einen Desktop-PC/Workstation handelt.
Ich habe auf die Jedi-Komponente TJvComputerInfoEx und ihre "Batterie-Eigenschaften" gehofft, aber weil ich gemerkt habe, dass es darüber nicht klappt, möchte ich mich erstmal kurz erkundigen, ob das hier jemand schon weiß.

Evtl. geht's doch über TJvComputerInfoEx...

Oder finde ich es irgendwo in der Registry?

Oder eine andere Komponente?


Cheers,

Hütte


Moderiert von user profile iconUGrohne: Topic aus VCL (Visual Component Library) verschoben am Mo 18.06.2007 um 10:54


UGrohne - Mo 18.06.07 10:53

100%ig wirst Du es wahrscheinlich nie sagen können, aber Du kannst es mit einer bestimmten Wahrscheinlichkeit prüfen. Ob sich das allerdings lohnt, ist fraglich. Daher: Wozu brauchst Du das?

Du müsstest die Hardware im Rechner überprüfen und je mehr Hardware drinsteckt, die normalerweise nur für Notebooks verwendet wird, desto höher ist die Wahrscheinlichkeit, dass es sich um ein Notebook handelt.
Beispiel dafür wären: Pentium M-Prozessoren, Synaptics Touchpads, Akkus. mobile Grafikchips, usw usf.

Probleme werden Dir dann Notebooks mit Desktop-Hardware machen, also die Teile mit 4-5kg und lärmendem Lüfter *g*.


mkinzler - Mo 18.06.07 10:54

Da ein laptop ein normaler Rechner ist, wird das nicht so ohne weiteres möglich sein. Du kannst nur nach Indizien suchen, welche aber nicht eindeutig sein können. Warum brauchst du das?


Delete - Mo 18.06.07 11:36

Vorschlag:

Auf Lidswitch (SYS_BUTTON_LID) prüfen - nur Notebooks haben den...

SYS_BUTTON_POWER 0x00000001 // Power toggle key
SYS_BUTTON_SLEEP 0x00000002 // Sleep key
SYS_BUTTON_LID 0x00000004
SYS_BUTTON_WAKE 0x80000000 // Wake key could be any key


Logikmensch - Mo 18.06.07 12:22

Ein solches Programm macht in der Tat kaum Sinn.
Ich habe mir kürzlich einen neuen Desktop-PC gekauft, der fast alles bot, was auch mein Notebook-PC bietet. Also bitteschön, wo soll denn da eine Grenze geschaffen werden.

Naja, man könnte natürlich einfach eine Benutzerabfrage machen oder einen Eintrag in eine INI-Datei und die abfragen. So würde ich es lösen, wenn ich es denn müsste.


TheHuette - Mo 18.06.07 13:18

Danke soweit!

Ich finde es auch etwas strange, das zu überprüfen, aber in einem Programm, das ein Kollege programmiert, soll die Abfrage rein. Es hat mit lokalen Lizenzen zu tun.

Ich befürchte auch, dass die Grenzen schwammig sind, aber hathors Vorschlag hört sich ja nicht schlecht an.
Habe auch gelesen, dass man sich gut nach PCMCIA (Treiber etc) richten kann.

http://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/tsleft.web+WinBatch/System~Info+Detect~a~Laptop.txt

Ich werd's mal probieren. Halte aber eigentlich auch einen INI-Eintrag oder so für sinnvoll...


mkinzler - Mo 18.06.07 13:25

Es gibt aber auch PCMCIA-Einschübe für noramle PCs


TheHuette - Mo 18.06.07 14:49

user profile iconmkinzler hat folgendes geschrieben:
Es gibt aber auch PCMCIA-Einschübe für noramle PCs

Das ist wahrscheinlich bei fast allen Merkmalen das Problem, glaube ich. Es sei denn die LID-Switch-Sache bringt's.

Es ist keine lebenswichtige Überprüfung. Nur ein kleines Feature. Ich werd der LID Sache nachgehen und testen.


Agawain - Mo 18.06.07 16:49

Hi

wenn Dein Kollege damit eine zweite Installation lediglich auf einem Laptop erlauben will und darüberhinaus geht nix mehr, wäre ich als Käufer glaub ich etwas sauer, was meinste, wie oft ich schon die Ide neu installieren mußte.
Platte kaputt, Prozessor defekt usw.

Und dann jedesmal neuen Registrierungsschlüssel anfordern :x

Gruß

Aga


TheHuette - Mo 18.06.07 16:55

user profile iconAgawain hat folgendes geschrieben:
Hi

wenn Dein Kollege damit eine zweite Installation lediglich auf einem Laptop erlauben will und darüberhinaus geht nix mehr, wäre ich als Käufer glaub ich etwas sauer, was meinste, wie oft ich schon die Ide neu installieren mußte.
Platte kaputt, Prozessor defekt usw.

Und dann jedesmal neuen Registrierungsschlüssel anfordern :x

Gruß

Aga


Über den Hintergrund der Funktion braucht ihr euch nicht den Kopf zu zerbrechen ;) . Sowas wie oben können wir unseren Kunden nicht zumuten. Es geht nur darum, dass auf Notebooks eine Anwendung von uns zu 90%-Wahrscheinlichkeit mit einer lokalen und somit nicht-Netzwerk-Lizenz arbeitet und ein INI-Eintrag gemacht werden soll, der das Abrufen der Lizenz beschleunigt.


Delete - Mo 18.06.07 23:41

Der String "ACPI Lid" ist in der Registry mehrmals vorhanden, wenn es ein Notebook ist...


TheHuette - Mi 20.06.07 14:55

user profile iconhathor hat folgendes geschrieben:
Der String "ACPI Lid" ist in der Registry mehrmals vorhanden, wenn es ein Notebook ist...


Meinst du vielleicht den String "ACPI-Deckel" bzw. enstpricht er dem Eintrag? Den konnte ich bisher auf allen Notebooks und auf keinem Desktop-PC finden.
Das ist der Wert für DriverDesc in
"HKLM\System\ControlSet001\Control\Class\{4D36E97D-E325-11CE-BFC1-08002BE10318}\0010".
Da der Schlüssel aber nicht immer gleich heisst (Nummer des letzten "Sub-Schlüssels" variert - hier: 0010), kann ich mich daran nur schwer orientieren.
Andere Sprachen und Betriebssysteme sind dabei natürlich auch zu beachten.

Das scheint ja ein Treiber zu sein, der eine Funktion beim Zuklappen des Notebooks startet (Sleep, Shut Down...). Ob ich irgendwie anders überprüfen kann, ob es die Funktion bzw. den Treiber gibt?


Agawain - Mi 20.06.07 15:10

Hi was hältste denn von GetSystemPowerStatus ?

http://blog.noop.se/2006/09/02/GetSystemPowerStatus++Read+The+Current+Power+Status+In+The+System.aspx

Gruß

Aga

//hier das ganze auch in Delphi

http://www.dsdt.info/tipps/?id=629


COMMANDER86 - Mi 20.06.07 15:23

Kleiner (vermutlich mittlerweile unwesentlicher) Zusatz. Mein Notebook hat keine PCMCIA-Ports mehr. Dafür 'nen ganzen Batzen an USB. Eine Unterscheidung auf diesem Wege würde also auch keine Sicherheit geben. UBS-Ports haben neue Rechner auch zahlreich...

Ob das über den Akku funktioniert, kann ich nicht sagen... nimmt man den Akku raus und betreibt die Kiste nur via Netzteil, wird der Akku ja nirgends mehr angezeigt.

Vielleicht gibt es eine Möglichkeit einen Tastendruck auf "FN" abzufangen. Das Dingen kenn' ich am Rechner nun nicht, wobei es auch nicht jeden Tag benutzt wird. ^^


Agawain - Mi 20.06.07 15:26

Zu diesem Problem

dieser Link

http://www.elists.org/pipermail/delphi-talk/2000-March/003409.html

Gruß

Aga


TheHuette - Mi 20.06.07 15:34

user profile iconAgawain hat folgendes geschrieben:
Hi was hältste denn von GetSystemPowerStatus ?

http://blog.noop.se/2006/09/02/GetSystemPowerStatus++Read+The+Current+Power+Status+In+The+System.aspx

Gruß

Aga

//hier das ganze auch in Delphi

http://www.dsdt.info/tipps/?id=629


Ich denke das eignet sich nicht, weil es dem JvComputerInfo-Problem entspricht, das ich, merke ich gerade, noch nicht erläutert habe. Problem dabei ist: Falls jemand mal den Akku entnommen hat, kann man nicht mehr zwischen NB und Desktop-PC unterscheiden. Ansonsten wäre die Akku-Sache super, aber ich denke die von dir genannten Funktionen werden das gleiche Problem haben. Werd's aber noch mal testen...


TheHuette - Mi 20.06.07 15:41

user profile iconAgawain hat folgendes geschrieben:
Zu diesem Problem

dieser Link

http://www.elists.org/pipermail/delphi-talk/2000-March/003409.html

Gruß

Aga


Das macht meinen vorherigen Post vielleicht überflüssig. Danke! Werd's probieren.


COMMANDER86 - Mi 20.06.07 15:41

user profile iconAgawain hat folgendes geschrieben:
Zu diesem Problem

dieser Link

http://www.elists.org/pipermail/delphi-talk/2000-March/003409.html

Gruß

Aga


Da steht's drin. Nimmt man den Akku raus, funktioniert es nicht (zwingend).

//EDIT: Dar war jemand schon schneller. ;)


TheHuette - Mi 20.06.07 17:02

aus http://www.elists.org/piper...00-March/003409.html zu GetSystemPowerStatus:

Zitat:
I tried this:

if GetSystemPowerStatus(ps) then
if ps.BatteryFlag = 128 then
MessageBox(Application.Handle,'Desktop','PC type',MB_OK)
else
MessageBox(Application.Handle,'Laptop','PC type',MB_OK)
else
MessageBox(Application.Handle,'Desktop','PC type',MB_OK);

and tried it on a few laptops and desktops around the office. It worked
perfectly well, until I tried it in a laptop running on mains power with the
battery removed. In this case the call succeeds, and returns 128 in
the ps.BatteryFlag :-(


Das kann ich noch nachvollziehen...

Zitat:
I tested the function under NT 4.0 SP6. I got the same errormessage. But the
message also show's the WIN-Errorcode 120. When you look into the Win 32 SDK
you can read that 120 means ERROR_CALL_NOT_IMPLEMENTED. So I claim that the
errormessagetext is wrong.

Therefore I assume, when the GetSystemPowerStatus result is false my app is
running on a desktop. When the result is True (on my laptop the result ist
true !!!) my app is running on a laptop.


Das ist entweder Trash oder eine NT 4.0 Eigenart. Unter WinXP bringt das nichts.

:roll: :?: :roll:

@hathor

Zitat:
Auf Lidswitch (SYS_BUTTON_LID) prüfen - nur Notebooks haben den...

SYS_BUTTON_POWER 0x00000001 // Power toggle key
SYS_BUTTON_SLEEP 0x00000002 // Sleep key
SYS_BUTTON_LID 0x00000004
SYS_BUTTON_WAKE 0x80000000 // Wake key could be any key


Wie kann ich auf SYS_BUTTON_LID mit Delphi zugreifen? Konnte da noch nichts zu finden.


Delete - Do 21.06.07 09:59

Das File cmbatt.sys sollte eigentlich nur in Notebooks vorhanden sein:

Bitte testen und Ergebnisse posten.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function SystemDirectory: string;
var
  SysDir: PChar;
begin
  SysDir := StrAlloc(MAX_PATH);
  GetSystemDirectory(SysDir, MAX_PATH);
  Result := string(SysDir);
  if Result[Length(Result)] <> '\' then
    Result := Result + '\';
  StrDispose(SysDir);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Label1.Caption:= 'Looking for '+ SystemDirectory + 'Drivers\cmbatt.sys...';
if FileExists(SystemDirectory + 'Drivers\cmbatt.sys'then
Label2.caption:= 'RESULT: This is a Notebook-Computer'
else Label2.caption:= 'RESULT: This is a Desktop-PC';
end;


UGrohne - Do 21.06.07 10:04

user profile iconhathor hat folgendes geschrieben:
Das File cmbatt.sys sollte eigentlich nur in Notebooks vorhanden sein:

Bitte testen und Ergebnisse posten.

Die Datei hat sowohl mein Vista-Notebook, als auch mein Windows 2003-Server. Ich denke, diese Datei wird jedes System haben ...


Tilo - Do 21.06.07 11:28

WinXP Laptop hat wird korrekt erkannt. Am Wochenende kann ichs an einem WinXP Desktop testen


Delete - Do 21.06.07 12:04

Habe einen neuen Test - Bedingung: WMI muss vorhanden sein.

Bitte Ergebnis (Zahl und Text) posten. Vielen Dank!

INFO:

http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/hey0921.mspx


Tilo - Do 21.06.07 12:38

10
This is a NOZEBOOK


TheHuette - Do 21.06.07 14:06

Danke für den Einsatz!

Ich kann heute und morgen leider selber nicht weiter daran forschen.

So wie's aussieht erst am Montag wieder, sorry...


TheHuette - Do 21.06.07 17:00

user profile iconUGrohne hat folgendes geschrieben:
user profile iconhathor hat folgendes geschrieben:
Das File cmbatt.sys sollte eigentlich nur in Notebooks vorhanden sein:

Bitte testen und Ergebnisse posten.

Die Datei hat sowohl mein Vista-Notebook, als auch mein Windows 2003-Server. Ich denke, diese Datei wird jedes System haben ...


Kann ich bestätigen. Windows XP Notebook und Windows XP Desktop-PC verglichen.

Zitat:
Habe einen neuen Test - Bedingung: WMI muss vorhanden sein.


Dem wird nachgegangen...Danke...


TheHuette - Do 21.06.07 17:52

isNOTEBOOK.exe auf verschiedenen System getestet:

2 x Desktop PC mit WinXP SP2 : "3 This is a Desktop PC"
1 x Desktop PC mit Win ME Home: "3 This is a Desktop PC"
2 x Notebook mit WinXP SP2 : "1 This is a Desktop PC"
3 x Notebook mit WinXP SP2 : "8 This is a portable PC"
1 x Notebook mit WinXP SP2 : "10 This is a portable PC"
1 x Notebook mit Linux : "Test ___" ;)

...ich habe auch noch mehr Rechner getestet. Bei Bedarf kann ich Details nennen.

Es sieht nach folgender Regel aus:

3 = Desktop
1, 8, 10 = Notebook

Die Schussfolgerung in der Message ist offensichtlich noch nicht richtig, aber die Ziffer bestätigt sich. :)

Habe demzufolge starkes Interesse am Delphi Code ;)

Gruß,

Martin


UGrohne - Do 21.06.07 19:45

user profile iconTheHuette hat folgendes geschrieben:
isNOTEBOOK.exe auf verschiedenen System getestet:

2 x Desktop PC mit WinXP SP2 : "3 This is a Desktop PC"
1 x Desktop PC mit Win ME Home: "3 This is a Desktop PC"
2 x Notebook mit WinXP SP2 : "1 This is a Desktop PC"
3 x Notebook mit WinXP SP2 : "8 This is a portable PC"
1 x Notebook mit WinXP SP2 : "10 This is a portable PC"
1 x Notebook mit Linux : "Test ___" ;)

...ich habe auch noch mehr Rechner getestet. Bei Bedarf kann ich Details nennen.

Es sieht nach folgender Regel aus:

3 = Desktop
1, 8, 10 = Notebook

Die Schussfolgerung in der Message ist offensichtlich noch nicht richtig, aber die Ziffer bestätigt sich. :)

Habe demzufolge starkes Interesse am Delphi Code ;)

Gruß,

Martin

Ne, dann passts wieder nicht perfekt, weil mein Server hatte heute mittag 1 gemeldet, also hier Notebook, bei mir Desktop.


COMMANDER86 - Do 21.06.07 19:53

Also... mittlerweise glaube ich es wäre am einfachsten eine Abfrage beim ersten Programmstart einzufügen von wegen:

Sitzt Du vor einem Laptop/Notebook oder hat Dein Rechner eine eigene(n) Tastatatur, Maus und Monitor und nennt sich Desktop oder Tower?

Eindeutige Merkmale lassen sich anscheindend nicht finden:

- Der Akku war eine gute Idee, schied aber bei Demontage aus.

- Taste FN wird nicht ständig benutzt.

- Diverse Systemdateien werden beidseitig genutzt.

Da bleibt doch eigentlich nur noch die Abfrage, ob der Rechner eine eingebaute Tastatur hat, oder!?

//EDIT: Das eingebaute Touchpad ist eine gute Sache. Allerdings haben die völlig unterscheidliche Treiber, je nach Hersteller, und gelten als PS/2 oder (neuerdings) USB-Maus. Des Weiteren gibt es auch Notebooks ohne Touchpad... beispielsweise IBM Thinkpads... T22.... T23... and so on. Werde weiter suchen, aber ich befürchte, eindeutige Lösungen gibt es nicht:

- Grafikkarte mit internem Ausgang und einem externen Ausgang... kann man sowas prüfen? Vermutlich nicht... Da muss man ja auch den Unterschied zwischen VGA und DVI machen...

Ich kann nur Glück wünschen, dass einer der Profis eine Antwort findet. ;)


Delete - Fr 22.06.07 00:54

Im Anhang ist die DELPHI-Umsetzung des folgenden Programms:

Quelle:

http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/hey0921.mspx


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colChassis = objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For Each objChassis in colChassis
    For  Each strChassisType in objChassis.ChassisTypes
        Select Case strChassisType
            Case 1
                Wscript.Echo "Other"
            Case 2
                Wscript.Echo "Unknown"
            Case 3
                Wscript.Echo "Desktop"
            Case 4
                Wscript.Echo "Low Profile Desktop"
            Case 5
                Wscript.Echo "Pizza Box"
            Case 6
                Wscript.Echo "Mini Tower"
            Case 7
                Wscript.Echo "Tower"
            Case 8
                Wscript.Echo "Portable"
            Case 9
                Wscript.Echo "Laptop"
            Case 10
                Wscript.Echo "Notebook"
            Case 11
                Wscript.Echo "Handheld"
            Case 12
                Wscript.Echo "Docking Station"
            Case 13
                Wscript.Echo "All-in-One"
            Case 14
                Wscript.Echo "Sub-Notebook"
            Case 15
                Wscript.Echo "Space Saving"
            Case 16
                Wscript.Echo "Lunch Box"
            Case 17
                Wscript.Echo "Main System Chassis"
            Case 18
                Wscript.Echo "Expansion Chassis"
            Case 19
                Wscript.Echo "Sub-Chassis"
            Case 20
                Wscript.Echo "Bus Expansion Chassis"
            Case 21
                Wscript.Echo "Peripheral Chassis"
            Case 22
                Wscript.Echo "Storage Chassis"
            Case 23
                Wscript.Echo "Rack Mount Chassis"
            Case 24
                Wscript.Echo "Sealed-Case PC"
            Case Else
                Wscript.Echo "Unknown"
            End Select
    Next
Next


Moderiert von user profile iconUGrohne: Code-Tags hinzugefügt (Wir haben leider keinen vbs-Tag ;))


TheHuette - Fr 22.06.07 09:47

user profile iconUGrohne hat folgendes geschrieben:
user profile iconTheHuette hat folgendes geschrieben:
isNOTEBOOK.exe auf verschiedenen System getestet:

2 x Desktop PC mit WinXP SP2 : "3 This is a Desktop PC"
1 x Desktop PC mit Win ME Home: "3 This is a Desktop PC"
2 x Notebook mit WinXP SP2 : "1 This is a Desktop PC"
3 x Notebook mit WinXP SP2 : "8 This is a portable PC"
1 x Notebook mit WinXP SP2 : "10 This is a portable PC"
1 x Notebook mit Linux : "Test ___" ;)

...ich habe auch noch mehr Rechner getestet. Bei Bedarf kann ich Details nennen.

Es sieht nach folgender Regel aus:

3 = Desktop
1, 8, 10 = Notebook

Die Schussfolgerung in der Message ist offensichtlich noch nicht richtig, aber die Ziffer bestätigt sich. :)

Habe demzufolge starkes Interesse am Delphi Code ;)

Gruß,

Martin

Ne, dann passts wieder nicht perfekt, weil mein Server hatte heute mittag 1 gemeldet, also hier Notebook, bei mir Desktop.


Kann ich leider bestätigen. Win 2003 Server und Win 2000 Server sagen beide "1 This is a Desktop PC". Das kommt der Sache in die Quere.
Man könnte das Betriebssystem vorher abfragen, ob's Server ist.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Wenn BS = Server
  Dann Rechner = Desktop PC
  keine weitere Prüfung
Andernfalls // d.h. BS != Server
  iCheckNB = isNotebook.exe-Überprüfung
  case (iCheckNB)
    3 : Desktop
    1,8,10 : Notebook
  ende
ende


Werden jetzt aber wahrscheinlich erstmal die Batterie-Überprüfung nutzen, auch wenn's nicht lückenlos passt und später weiter nach einer 100%igen Lösung suchen.

Danke soweit!

Gruß,

Martin


Alice - So 08.02.09 16:14

hi,

mit den registry-keys:


Quelltext
1:
2:
3:
4:
5:
6:
HKEY_LOCAL_MACHINE

SYSTEM\CurrentControlSet\Control\Class\{72631E54-78A4-11D0-BCF7-00AA00B7B32A}\0000
SYSTEM\CurrentControlSet\Control\Class\{72631E54-78A4-11D0-BCF7-00AA00B7B32A}\0001

Section 'InfSection'


klappt es eigentlich ganz gut.
wenn hier der string 'cmbatt_inst' auftaucht ist es mit
grösster wahrscheinlichkeit ein laptop.

zumindest klappt es hier mit ca.100 maschinen (querbeet) mit einer fehlerquote von <1%.

cu