Maus-Meter

  • Die DOTS/inch sind die PIXEL/inch.


    hmm... hast recht, stimmt beim Bildschirm
    Aber logische Auflösung in Pixel und physiaklische Auflösung in Pixel stimmen nur bei nativer Auflösung überein.
    Wenn logisch < physikalisch, dann sind mehrere physik. Pixel pro logischerm Pixel :( und nicht, dass einfach ein kleinerer Monitorausschnitt verwendet wird :(

    Und es muss nicht sein, dass Monitore keine größeren Auflösungen als die physikalische ertragen. Manch können das Bild auch verkleinern, nicht nur vergrößern ;)

    • Offizieller Beitrag

    Hatte neulich den Effekt bei einem Notebook, an dem zusätzlich ein 22" Monitor dranhing. Beide Screens waren per Clone-Modus in Betrieb, aber die höhere Auflösung des 22"-Monitors war eingestellt. Auf dem Display des Notebooks konnte man dann den Bildschirm hin- und herscrollen.
    Das ist also auch noch eine Option.

  • Die Koordinatensysteme in Windows arbeiten alle mit logischen Einheiten.
    Die MSDN-Dokumentation zu HORZRES und VERTRES ist falsch ! Denn wie wir gesehen haben,wird die logische Bilschirmgröße für 1280x1024 zurückgegeben.

    Aber via WMI können wir die max. physikalische Auflösung ermitteln.
    Nun brauchen wir nur noch einen Speicherkontext erzeugen, ihm diese Auflösung/Größe verpassen und dann den Bildschirmkontext in den Speicherkontext mappen.
    Dann kann man die ganze Rechengeschichte für die Maus in dem Speicherkontext durchführen.


    Gruß


    Einmal editiert, zuletzt von Greenhorn (24. Oktober 2008 um 17:37)

  • Das mit der WMI hatte ich auch mal gefunden nur bei mir hat es an 3 von 5 rechnern eine höhere Auflösung als Objekt gegeben als in den Einstellungen der Graka... aber ich weiss leider nicht warum und hab auch keine Lösung gefunden... Ich hab grade nochmal an meinem Rechner hier im Büro geschaut, da scheint es zu stimmen.

    Dann unterstützt die Firmware des Monitors vllt keine Funktionen um die Auflösung zu ermitteln ...


    Gruß


    Einmal editiert, zuletzt von Greenhorn (24. Oktober 2008 um 17:43)

  • Ich hab dem ganzen noch ein kleines gui gegeben und den rechenteil in eine UDF gesteckt.

    Falls es nun eine lösung gibt den DPI wert zu ermitten werde ich das auch noch anfügen.

  • Ich hab dem ganzen noch ein kleines gui gegeben und den rechenteil in eine UDF gesteckt.

    Falls es nun eine lösung gibt den DPI wert zu ermitten werde ich das auch noch anfügen.

    [autoit]

    #include <WinAPI.au3>
    Global Const $HORZSIZE = 4
    Global Const $VERTSIZE = 6
    Global Const $HORZRES = 8
    Global Const $VERTRES = 10
    Global Const $LOGPIXELSX = 88
    Global Const $LOGPIXELSY = 90
    Global Const $BITSPIXEL = 12

    [/autoit][autoit][/autoit][autoit]

    $ScreenDC = _WinAPI_GetDC (0)
    $logX = _WinAPI_GetDeviceCaps ($ScreenDC, $LOGPIXELSX) ; Number of pixels per logical inch along the screen width
    $logY = _WinAPI_GetDeviceCaps ($ScreenDC, $LOGPIXELSY) ; Number of pixels per logical inch along the screen height
    $width = _WinAPI_GetDeviceCaps ($ScreenDC, $HORZSIZE) ; width in mm
    $height = _WinAPI_GetDeviceCaps ($ScreenDC, $VERTSIZE) ; height in mm
    $pixelsX = _WinAPI_GetDeviceCaps ($ScreenDC, $HORZRES) ; x pixels
    $pixelsY = _WinAPI_GetDeviceCaps ($ScreenDC, $VERTRES) ; y pixels
    $bitspxl = _WinAPI_GetDeviceCaps ($ScreenDC, $BITSPIXEL) ; bits per pixel
    _WinAPI_ReleaseDC (0, $ScreenDC)

    [/autoit][autoit][/autoit][autoit]

    MsgBox (0, '', $width & ' x ' & $height & ' mm (' & $pixelsX & ' x ' & $pixelsY & ')' & _
    @CRLF & @CRLF & _
    'dpi = ' & $logX & ' Pixel/Zoll' & @CRLF & _
    'Farbtiefe = ' & $bitspxl & ' Bit')

    [/autoit]


    Gruß


  • So, die finale version is drausen.
    Bei Problemen, Fehlern oder Verbesserungsvorschlägen einfach Posten oder Pm, viel spaß :D

    • Offizieller Beitrag

    Ich habe die Vorschläge von Greenhorn bezüglich WMI mal in zwei Funktionen gepackt, womit man dann die DPI-Zahl für die momentan eingestellte Auflösung erhält:

    Spoiler anzeigen
    [autoit]


    ;~ MsgBox(0, 0, 'Höchste Auflösung: ' & _GetMaxResolution())
    ;~ MsgBox(0, 0, 'DPI: ' & _GetLogPixels())
    $MaxRes = _GetMaxResolution()
    $DPI = _GetLogPixels() / Number(StringLeft($MaxRes, StringInStr($MaxRes, ' '))) * @DesktopWidth
    MsgBox(0, 0, $DPI)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetLogPixels()
    Local $LogPixels
    Local $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DisplayConfiguration', 'WQL', 0x30)
    If IsObj($colItems) then
    For $objItem In $colItems
    $LogPixels = $objItem.LogPixels
    Next
    Return $LogPixels
    Endif
    Return SetError(1, 0, 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetMaxResolution()
    Local $Output
    Local $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_VideoSettings', 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $Output &= $objItem.Setting & @CRLF
    Next
    EndIf
    Local $aOut = StringRegExp($Output, '="(\d+ x \d+)', 3), $tmp
    If IsArray($aOut) Then
    For $i = 0 To UBound($aOut) - 2
    For $j = $i + 1 To UBound($aOut) - 1
    If Number(StringLeft($aOut[$i], StringInStr($aOut[$i], ' '))) <= Number(StringLeft($aOut[$j], StringInStr($aOut[$j], ' '))) Then
    If Number(StringMid($aOut[$i], StringInStr($aOut[$i], 'x ') + 1)) <= Number(StringMid($aOut[$j], StringInStr($aOut[$j], 'x ') + 1)) Then
    $tmp = $aOut[$i]
    $aOut[$i] = $aOut[$j]
    $aOut[$j] = $tmp
    EndIf
    EndIf
    Next
    Next
    Return $aOut[0]
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc

    [/autoit]

    Das entspricht zwar nicht 100-prozentig den tatsächlichen Abmessungen, aber für das Maus-Meter reicht's völlig. :)