Maus-Meter

  • Dieses kleine Prog misst die zurückgelegte Strecke des Cursors in Pixel und cm.
    DPI wird automatisch ermittelt, bei DPI einfach das stehen lassen was da schon steht.

    Hier der Source code:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <Mouse-Meter.au3>
    #include <WinAPI.au3>
    Opt("TrayMenuMode", 1)
    Global $start = False
    HotKeySet("^{HOME}", "Reset")
    HotKeySet("^{END}", "Ende")
    ;------------------------DPI_Ermitteln----------------
    Global Const $LOGPIXELSX = 88
    $ScreenDC = _WinAPI_GetDC(0)
    $logX = _WinAPI_GetDeviceCaps($ScreenDC, $LOGPIXELSX)
    _WinAPI_ReleaseDC(0, $ScreenDC)
    ;------------------------DPI_Ermitteln----------------
    $GUI = GUICreate("Mouse-Meter", 108, 130, 193, 125, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    $CheckboxPixel = GUICtrlCreateCheckbox("Pixel", 16, 8, 73, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $CheckboxCm = GUICtrlCreateCheckbox("Cm", 16, 24, 73, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $CheckboxPPM = GUICtrlCreateCheckbox("PPM", 16, 40, 73, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $CheckboxCmm = GUICtrlCreateCheckbox("cm/min", 16, 56, 73, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $guiDPI = GUICtrlCreateInput("DPI (" & $logX & ")", 16, 73, 73, 21)
    $KKTHX = GUICtrlCreateButton("OK", 16, 96, 75, 25, 0)
    GUISetState(@SW_SHOW)

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

    $wiederherstellen = TrayCreateItem("Wiederherstellen")
    $Reset = TrayCreateItem("Reset")
    $Pause = TrayCreateItem("Pause")
    TrayItemSetState(-1, $TRAY_DISABLE)
    $Schliessen = TrayCreateItem("Exit")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $KKTHX
    $DPI = GUICtrlRead($guiDPI)
    If $DPI = "DPI (" & $logX & ")" Then $DPI = $logX
    If Not StringIsInt($DPI) Then
    $start = False
    MsgBox(0, "Mouse-Meter", "Eine Zahl als DPI angeben!")
    ElseIf $DPI <= 0 Then
    $start = False
    MsgBox(0, "Mouse-Meter", "Eine Zahl >0 bei DPI eintragen!")
    Else
    $start = True
    GUISetState(@SW_HIDE)
    TrayItemSetState($Pause, $TRAY_ENABLE)
    EndIf
    EndSwitch
    Switch TrayGetMsg()
    Case $wiederherstellen
    GUISetState(@SW_SHOW)
    Case $Reset
    Reset()
    Case $Pause
    $start = Not $start
    Case $Schliessen
    Exit
    EndSwitch
    If $start Then
    ToolTip(MouseMeter($DPI, GUICtrlRead($CheckboxPixel), GUICtrlRead($CheckboxPPM), GUICtrlRead($CheckboxCm), GUICtrlRead($CheckboxCmm)), 0, 0)
    EndIf
    WEnd
    Func Reset()
    $mmcPixel = 0
    $MouseposOld = MouseGetPos()
    $MouseposNew = MouseGetPos()
    $Timer = TimerInit()
    EndFunc ;==>Reset
    Func Ende()
    Exit
    EndFunc ;==>Ende

    [/autoit]

    hier noch die UDF dazu:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GUIConstantsEx.au3>
    Global $mmcPixel = 0, $MouseposOld = MouseGetPos(), $MouseposNew = MouseGetPos(), $mmTimer = TimerInit(), $mmdoonce = True
    Func MouseMeter($mmDPI, $mmPixel = $GUI_UNCHECKED, $mmPPM = $GUI_UNCHECKED, $mmCm = $GUI_UNCHECKED, $mmCmm = $GUI_UNCHECKED)
    Local $mmString = "", $mmCRLF = ""
    if $mmdoonce Then
    $MouseposOld = MouseGetPos()
    $MouseposNew = MouseGetPos()
    $mmTimer = TimerInit()
    $mmcPixel = 0
    $mmdoonce = False
    EndIf
    $MouseposNew = MouseGetPos()
    If $MouseposOld[0] <> $MouseposNew[0] Or $MouseposOld[1] <> $MouseposNew[1] Then
    $mmcPixel += dif($MouseposOld[0], $MouseposNew[0]) + dif($MouseposOld[1], $MouseposNew[1])
    $MouseposOld = MouseGetPos()
    EndIf
    $intCM = Round($mmcPixel * 2.54 / $mmDPI, 2)
    If $intCM > 935060606060606060.60606060606061 Then
    $intCMt = Round($intCM / 935060606060606060.60606060606061) & " lichtjahre"
    ElseIf $intCM > 100000 Then
    $intCMt = Round($intCM / 100000, 2) & " km"
    ElseIf $intCM > 100 Then
    $intCMt = Round($intCM / 100, 2) & " m"
    Else
    $intCMt = $intCM & " cm"
    EndIf
    If $mmPixel = $GUI_CHECKED or $mmPixel = 1 Then
    $mmString &= $mmcPixel & ' Pixel'
    $mmCRLF = @CRLF
    EndIf
    If $mmPPM = $GUI_CHECKED or $mmPPM = 1 Then
    $mmString &= $mmCRLF & Round($mmcPixel / (TimerDiff($mmTimer) / 60000)) & " PPM"
    $mmCRLF = @CRLF
    EndIf
    If $mmCm = $GUI_CHECKED or $mmCm = 1 Then
    $mmString &= $mmCRLF & $intCMt
    $mmCRLF = @CRLF
    EndIf
    If $mmCmm = $GUI_CHECKED or $mmCmm = 1 Then
    $mmString &= $mmCRLF & Round($intCM / (TimerDiff($mmTimer) / 60000)) & " cm/min"
    EndIf
    Sleep(1)
    Return $mmString
    EndFunc ;==>MouseMeter
    Func dif($Dif1, $Dif2)
    Local $Result
    If $Dif1 > $Dif2 Then
    $Result = $Dif1 - $Dif2
    ElseIf $Dif1 < $Dif2 Then
    $Result = $Dif2 - $Dif1
    ElseIf $Dif1 = $Dif2 Then
    $Result = 0
    EndIf
    Return $Result
    EndFunc ;==>dif

    [/autoit]

    10 Mal editiert, zuletzt von Worfox (24. Oktober 2008 um 18:12)

  • also es misst die zurückgelegte strecke des cursors?

    Das mit der DPI haben Oscar und ich auch ewig versucht rauszukriegen -.-

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • 1.Korrekt

    2.72 DPI passt ziemlich genau bei mir

    ich hab dem prog auch noch eine "Pixel Per Minute" funktion gegeben
    d.h. wie viele Pixel weit sich der Cursor in der Minute bewegt.

    Einmal editiert, zuletzt von Worfox (22. Oktober 2008 um 15:39)

  • Also, hab mal ein paar anregungen:
    1) DPI über DC auslesen :)
    2) Für diagonale Strecken stimmt die Länge nicht.

    [autoit]

    $ScreenDC = _WinAPI_GetDC(0)
    $DPI = _WinAPI_GetDeviceCaps($ScreenDC,88) ; x-res
    ;~ _WinAPI_GetDeviceCaps($ScreenDC,90) ;, y-res
    _WinAPI_ReleaseDC(0,$ScreenDC)

    [/autoit]
    • Offizieller Beitrag

    Schade! Das ist auch nur der "physikalische" Wert. Also die max. mögliche DPI-Zahl.
    Bei mir kommt da zum Beispiel "96" raus, was ja soweit auch korrekt ist. Zumindest solange ich mit der nativen Auflösung (1920x1200) meines Monitors arbeite. Schalte ich hingegen in eine geringere Auflösung, so wird dieser Wert nicht angepasst. Damit stimmt dann aber die Berechnung der Strecke in cm nicht mehr, denn 1024 geteilt durch 96 ergibt halt nur 10,67 Zoll oder 27,09 cm. Mein Monitor hat aber eine horizontale Größe von 50,8 cm.
    Aber das Thema hatten wir ja schonmal... ;)

  • stimmt eigentlich die rechnung:

    [autoit]

    Round($Pixel / (TimerDiff($Start) / 60000))

    [/autoit]

    ich bin mir da irgentwie unsicher

  • Schade! Das ist auch nur der "physikalische" Wert. Also die max. mögliche DPI-Zahl.
    Bei mir kommt da zum Beispiel "96" raus, was ja soweit auch korrekt ist. Zumindest solange ich mit der nativen Auflösung (1920x1200) meines Monitors arbeite. Schalte ich hingegen in eine geringere Auflösung, so wird dieser Wert nicht angepasst. Damit stimmt dann aber die Berechnung der Strecke in cm nicht mehr, denn 1024 geteilt durch 96 ergibt halt nur 10,67 Zoll oder 27,09 cm. Mein Monitor hat aber eine horizontale Größe von 50,8 cm.
    Aber das Thema hatten wir ja schonmal... ;)


    Dann eben Dots per Millimeter selber ausrechenen :)

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

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

    $ScreenDC = _WinAPI_GetDC(0)
    $width = _WinAPI_GetDeviceCaps($ScreenDC,4) ; width in mm
    $pixelsX = _WinAPI_GetDeviceCaps($ScreenDC,8) ; x pixels
    $pixelsY = _WinAPI_GetDeviceCaps($ScreenDC,10) ; height in mm
    $height = _WinAPI_GetDeviceCaps($ScreenDC,6) ; Y pixels
    _WinAPI_ReleaseDC(0,$ScreenDC)

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

    $DPmmX = $pixelsX/$width
    $DPmmY = $pixelsY/$height

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

    MsgBox(0, 'DPmmX', $DPmmX)
    MsgBox(0, 'DPmmY', $DPmmY)

    [/autoit]
    • Offizieller Beitrag

    Ahh! Wir kommen der Sache schon näher.
    Aber...
    Wenn ich die native Auflösung verwende und dieses Script hier ausführe:

    [autoit]


    #include <WinAPI.au3>

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

    $ScreenDC = _WinAPI_GetDC(0)
    $width = _WinAPI_GetDeviceCaps($ScreenDC, 4) ; width in mm
    $pixelsX = _WinAPI_GetDeviceCaps($ScreenDC, 8) ; x pixels
    $pixelsY = _WinAPI_GetDeviceCaps($ScreenDC, 10) ; height in mm
    $height = _WinAPI_GetDeviceCaps($ScreenDC, 6) ; Y pixels
    _WinAPI_ReleaseDC(0, $ScreenDC)

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

    MsgBox(0, '', $width & ' x ' & $height & ' mm (' & $pixelsX & ' x ' & $pixelsY & ')')

    [/autoit]

    Wird die Höhe und Breite (fast) richtig angezeigt: 512x320 mm. Nachgemessen sind es 518x325 mm.
    Wenn ich jedoch auf eine geringere Auflösung ( z.B. 1024x768 ) runterschalte, dann zeigt mir obiges Script 426x320 mm an. :?::?::?:

    • Offizieller Beitrag

    Ja, damit hast Du wohl Recht und für Dein Maus-Meter ist diese Grundsatz-Diskussion auch übertrieben. Von daher OffTopic, aber es würde mich schon interessieren, ob es irgendwie eine Möglichkeit gibt, die angezeigte Auflösung und die dazugehörige DPI-Zahl auszulesen oder zu berechnen.

    Dabei fällt mir gerade ein: Wenn die ausgelesene DPI-Zahl für die max. Auflösung steht. Gibt es dann nicht irgendwo einen Eintrag, welches die max. Auflösung ist?
    Dann hätte man doch einen Umrechnungsfaktor und könnte die DPI-Zahl selbst errechnen... :S

  • so was änliches hab ich mal gemacht als ich mit autoit angefangen hab
    das zeigt auch die mausklicks

    Spoiler anzeigen
    [autoit]


    $pos = MouseGetPos()
    $oldpos = MouseGetPos()
    $oldpos = $oldpos[0] + $oldpos[1]
    Global $diff, $entfernu, $mausl = 0, $mausm = 0, $mausr = 0

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

    While 1
    $pos = MouseGetPos()
    $pos = $pos[0] + $pos[1]
    $diff = $pos - $oldpos
    If StringMid($diff,1,1) = "-" Then $diff = StringMid($diff,2)
    If _ispressed("01") Then $mausl = $mausl + 1
    If _ispressed("04") Then $mausm = $mausm + 1
    If _ispressed("02") Then $mausr = $mausr + 1
    ToolTip("Entfernung: " & $entfernu & " Pixel" &@CRLF&"Mausklicks links: "&$mausl&@CRLF&"Mausklicks Mitte: "&$mausm&@CRLF&"Mausklicks rechts: "&$mausr, 0, 0)
    While _ispressed("01") or _ispressed("02") or _ispressed("04")
    $pos = MouseGetPos()
    $pos = $pos[0] + $pos[1]
    $diff = $pos - $oldpos
    $entfernu = $entfernu + $diff
    $oldpos = $pos
    sleep(25)
    WEnd
    $entfernu = $entfernu + $diff
    $oldpos = $pos
    sleep(25)
    WEnd

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

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_Is_Key_Pressed

    [/autoit]
  • hmm gibts irgentwas womit man testen kann ob irgenteine taste gedrückt wurde?
    dann kann man auch die tastatur-drucke pro minute anzeigen lassen

    • Offizieller Beitrag

    FireFlyer: Achso, Du hattest da schon alles durch? Hatte ich nicht mehr in Erinnerung. :rolleyes:
    Ich wollte schon immer mal ein "Lineal-Programm" erstellen, also das man z.B. ein Blatt Papier an den Bildschirm halten kann und dann die Maße des Papiers in mm/cm sehen kann. Mein Lineal hat nämlich die dumme Angewohnheit, immer dann unauffindbar zu sein, wenn ich es brauche. Ich habe auch schonmal überlegt, so einen "Schlüssel-Wiederfind-Piepser" an dem Lineal anzubringen, aber letztendlich wäre so ein Programm doch besser. ;)
    Muss ich halt mit einem manuellen Korrekturfaktor arbeiten... :S

  • Tja, das Problem ist, dass Windows nur die DPI ( DOTS per inch) rausrückt, aber nicht die PPI ( PIXEL per inch) :( Auch die native Auflösung findet sich nirgends -> keine Berechnung von PPI möglich

  • Die DOTS/inch sind die PIXEL/inch.

    Spoiler anzeigen
    [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]

    Die Koordinaten aus dem Gerätekontext arbeiten mit logischen Einheiten.
    Von daher stimmen die Werte eigentlich schon, aber wenn ich, so wie Oscar, meinem Bildschirm eine kleinere Auflösung verpasse, dann arbeitet das System mit diesen logischen Einheiten, logisch. :rolleyes:
    Wenn ich dann auch noch eine 4:3 Auflösung in meinen 16:10 Monitor drücke, dann interpoliert der Monitor die logischen Einheiten auf die reellen, und somit stimmen die Werte natürlich nicht mehr.

    Deshalb soll man an seinem Monitor immer die max. Auflösung einstellen und wenn die Schrift oder die Icons zu klein sind, diese über die DPI angleichen.

    Für Vista gibt es die Funktion GetMonitorDisplayAreaSize() um die max. physische Größe der Anzeige zu ermitteln, aber leider nur für Vista ...

    EDIT:
    Mir ist da noch etwas eingefallen ...

    Wenn kein Grafiktreiber installiert ist, dann kann ich unter "Anzeige -> Einstellungen" eine höhere Bildschirmauflösung einstellen als der Monitor hergibt (und ihn damit ins Jenseits befördern).
    Sobald ich aber einen Grafiktreiber installiere kann ich auch nur die max. Auflösung des Monitors einstellen.

    Was sagt uns das ? ?(
    Der Grafiktreiber kennt die max. physische Auflösung des Monitors !

    Könnte man vllt per WMI herankommen ...

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WinAPI.au3>

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

    $hWnd = GUICreate ('Win32_VideoSettings', 640, 480, -1, -1, $WS_OVERLAPPEDWINDOW)

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

    $idEdit = GUICtrlCreateEdit ('', 0, 0, 640, 480, BitOR ($WS_VSCROLL, $ES_AUTOVSCROLL))

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

    GUISetState ()

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

    ; Generated by AutoIt Scriptomatic

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

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

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

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet ("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_VideoSettings", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj ($colItems) then
    For $objItem In $colItems
    $Output &= "Element: " & $objItem.Element & @CRLF
    $Output &= "Setting: " & $objItem.Setting & @CRLF
    ;if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    ;$Output=""
    Next
    GUICtrlSetData ($idEdit,$Output)
    Else
    GUICtrlSetData ($idEdit,"WMI Output","No WMI Objects Found for class: Win32_VideoSettings" )
    Endif

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

    While True

    Switch GUIGetMsg ()
    Case -3
    ExitLoop
    EndSwitch
    WEnd

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


    3 Mal editiert, zuletzt von Greenhorn (23. Oktober 2008 um 23:49)

  • @ greenhorn

    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.

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D