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
UGrohne: 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
mkinzler 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
Agawain 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
hathor 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?
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. ^^
TheHuette - Mi 20.06.07 15:34
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
Das macht meinen vorherigen Post vielleicht überflüssig. Danke! Werd's probieren.
COMMANDER86 - Mi 20.06.07 15:41
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
hathor 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
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
UGrohne hat folgendes geschrieben: |
hathor 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
TheHuette 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
UGrohne: Code-Tags hinzugefügt (Wir haben leider keinen vbs-Tag ;))
TheHuette - Fr 22.06.07 09:47
UGrohne hat folgendes geschrieben: |
TheHuette 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!