Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [FRAGE]Mousometer (https://www.delphipraxis.net/140858-%5Bfrage%5Dmousometer.html)

XXcD 27. Sep 2009 18:43


[FRAGE]Mousometer
 
Hallo,
ich habe hier nen kleines Display von Alphacool und dachte mir jetzt wäre cool wenn mir darauf die zurückgelegte Strecke der Maus angezeigt wird.
Nun habe ih in Win 7 diese kleine App die sich Mousometer nennt.

Jetzt zu meiner Frage, kann ich diese Minianwendungen in Windows irgendwie auslesen und die Werte dann auf dem Display ausgeben
oder sollte besser einen eigenen Algorithmus dafür schreiben?

jmd anders 27. Sep 2009 19:08

Re: [FRAGE]Mousometer
 
Das Auslesen kannst du wahrscheinlich mittels der Debug Funktion ReadProcessMemory(...)

Du musst natürlich wissen, wo der Wert in dem Speicher von dem anderen Programm steht. Dazu kannst du zb. TSearch benutzen.
Also du solltest nun mal bei google nach Beispielen für die Anwendung von ReadProcessMemory suchen und nach TSearch.

himitsu 27. Sep 2009 19:22

Re: [FRAGE]Mousometer
 
Im Grunde kannst du es doch selber auslesen/ausrechen?

globaler Maus-Hook

und dann mußt du nur noch die Pixel in cm umrechen (aber wurst du dir selber den Wert ermitteln müssen, da dieses ja bei nahezu Jedem unterschiedkich ist ... via Calibierung, also z.B. einfach die Maus 10cm verschieben und die Pixel zählen).

PS: http://www.svenbader.de/software_dow...mausometer.htm
das ist dahingehend "Schwachsin, da der Name falsch ist.

Der ermittelt mämlich in etwa die Werte des Mauszeigers, aber nicht der "Maus"
> viele Gamer haben eine sehr empfindliche und hoch eingestellte Maus, welche sich also vie schneller bewegt, als der Mauszeiger und dabei weniger Strecke zurücklegt.

XXcD 27. Sep 2009 19:29

Re: [FRAGE]Mousometer
 
Hmm also die größe der pixel kann man ja bestimmen indem man weiß wie groß der monitor ist und die auflösung.

Wenn sich die Maus schneller bewegt dann kann man da doch die dpi zahl mit einrechnen oder sehe ich das falsch?

PS: So wie ich das sehe wird der Wert vom Mousometer irgendwo gespeichert, da nach einem neustart der gesamtwert ja weiter läuft.
Kann man irgendwie rausfinden wo die Daten gespeichert werden?

himitsu 27. Sep 2009 19:43

Re: [FRAGE]Mousometer
 
Du kannst bei dem verlinken Tool einstellen, daß er es in einer INI (im Programmverzeichnis) speichern soll, ansonsten würde ich mal in der Registrie suchen.

Aber da wird natürlich vermutlich nie der grad aktuelle Wert drinstehn.

XXcD 27. Sep 2009 19:52

Re: [FRAGE]Mousometer
 
Hmm ja mit ner Ini das ist glaube ich nicht so das wahre.
Ich habe mir jetzt gerade nochmal den Code von dem Gadget genau angesehen und die Funktion gefunden die die Strecke speichert:

Code:
function updateval() {
 var posi=new Object()
 //var datum2 = new Date()
 //zeit3 = datum2.getTime();
 posi.x=window.event.screenX; posi.y=window.event.screenY;
 if (x2==-1 | y2==-1) { x2=posi.x; y2=posi.y; }
 else {
   x = posi.x; y = posi.y;
   if (Math.abs(x) > 5000) x=0; //wegen bug
   if (Math.abs(y) > 5000) y=0; //wegen bug
   spd = (Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2)) *10) /fs *0.036; // cm/sek -> km/h
   if(spd>topspd) {
    topspd=spd;
   System.Gadget.Settings.write("topspd", topspd);
   }
   wert += Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
   wertHeute += Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
   x2 = x; y2 = y;
   m = (wert/f);
   mHeute = (wertHeute/f);

   mstr = formatstr(m) ;
   mHeutestr = formatstr(mHeute) ;

   if ((m2 != m) ||  ( werte[3]!="0,00 km/h")) {
     if (tag()!= datum) { //tag gewechselt
       wertHeute = 0;
      datum = tag();
       System.Gadget.Settings.write("datum", datum);
       System.Gadget.Settings.write("wertHeute", wertHeute);
     }
     System.Gadget.Settings.write("wert", wert); //suboptimal             <---------Hier wird die Strecke gespeichert
     System.Gadget.Settings.write("wertHeute", wertHeute); //suboptimal    <---------Und hier die gesamte
     werte[1] = mstr+" m";
     werte[2] = mHeutestr+" m";
     werte[3] = spd.toFixed(2).toString().replace(".", ",")+" km/h";
     werte[4] = topspd.toFixed(2).toString().replace(".", ",")+" km/h";
     werte[5] = (m/40075000).toFixed(6).toString().replace(".", ",");
     m2 =m;
     document.getElementById("wert").firstChild.nodeValue   = werte[z1];
     document.getElementById("spd").firstChild.nodeValue    = werte[z2];
     document.getElementById("topspd").firstChild.nodeValue = werte[z3];
   }
 

}
}
Vielleicht hat sich damit schonmal einer beschäftigt und hat da eine Idee wie ich von ausserhalb auf genau diese Variablen zugreifen kann.
Also im RAM suchen wäre ja jetzt eine Möglichkeit aber vielleicht gibt es auch direkt eine Möglichkeit die Microsoft zur Verfügung stellt.

himitsu 27. Sep 2009 19:58

Re: [FRAGE]Mousometer
 
Ach du meine Güte, ist das "schlecht" ... da gehen ja einige Mausbewegungen unter/verloren oder werden falsch ermittelt :wall:

Nja egal ... mach es doch selber (wie schon gesagt)

Ideal wäre eigentlich ein Maus-Hock (findet man hier in der DP auch einiges zu diesem Thema)

oder du machst es so wie in dem Code.


Mouse.CursorPos aus der Unit Controls
oder direkt die WInAPI MSDN-Library durchsuchenGetCursorPos aus der Unit Windows
und die restlichen Berechnungen hast du ja in dem Code auch schon drin.
(das Ganze wird dort über einen Timer ausgewertet, was bei schnellen Bewegungen/Richtungswechseln natürlich "falsche" Meßwerte ergibt)

XXcD 27. Sep 2009 20:07

Re: [FRAGE]Mousometer
 
Ja ich glaube ich mache das auch selber die Koordinaten auslesen ist ja kein Problem aber muss mir mal gedanken machen die strecke zu berechnen :-D
Wenn ich da nicht weiter komme frage ich nochmal nach aber danke schonmal für die Infos

himitsu 27. Sep 2009 20:15

Re: [FRAGE]Mousometer
 
Zitat:

Zitat von XXcD
Wenn ich da nicht weiter komme frage ich nochmal nach aber danke schonmal für die Infos

> Satz des Pythagoras
> Delphi-Referenz durchsuchenSqr und Delphi-Referenz durchsuchenSqrt (die Formel wird 3-mal da oben berechnet ... einmal hätte ja auch gereicht :roll: )
> und übersetzt dir nicht unbedingt den Code direkt

nimm 'nen Timer mit vielleicht 10-20ms (weniger schaft der eh nicht)
und für die Geschwindigkeitsberechnung bietet sich Delphi-Referenz durchsuchenGetTickCount oder Delphi-Referenz durchsuchenNow an

Clemens L. 27. Sep 2009 21:21

Re: [FRAGE]Mousometer
 
Stichwort DPI (Dots per Inch), kann man auslesen. Musste sowas schon selber machen, keine große Sache eigentlich.

XXcD 27. Sep 2009 22:06

Re: [FRAGE]Mousometer
 
Ok jetzt bin ich doch leicht verwirrt.
Also mit dem Satz des Pythagoras wird ja die dritte Strecke in einem Dreieck berechnet,
aber warum muss man dann noch mittels sqr die Wurzel ziehen?

Und mit DPI wird doch auch die Geschwindigkeit der Maus angegeben(meine Maus hat 2.000 DPI) oder irre ich mich da?

Clemens L. 27. Sep 2009 22:26

Re: [FRAGE]Mousometer
 
Zitat:

Zitat von XXcD
Ok jetzt bin ich doch leicht verwirrt.
Also mit dem Satz des Pythagoras wird ja die dritte Strecke in einem Dreieck berechnet,
aber warum muss man dann noch mittels sqr die Wurzel ziehen?

Und mit DPI wird doch auch die Geschwindigkeit der Maus angegeben(meine Maus hat 2.000 DPI) oder irre ich mich da?


Mit DPI meinte ich die von Windows, die zur Darstellung verwendet wird. Wenn der Bildschirm nicht mit einer falschen Auflösung betrieben wird, kannst du damit die Pixel / Zoll berechnen. (Mein Windows hat z.b. 92 dpi glaub ich)

Siehe auch Punktdichte :)


Zweiter Nachtrag:

Selbst ein LowLevel-Maushook kommt bei schnellen bewegungen nicht mit :roll:

Medium 27. Sep 2009 22:40

Re: [FRAGE]Mousometer
 
Zitat:

Zitat von XXcD
Und mit DPI wird doch auch die Geschwindigkeit der Maus angegeben(meine Maus hat 2.000 DPI) oder irre ich mich da?

Du irrst dich. Maus mit 2000 DPI heisst zunächst einmal, dass wenn du die Maus 1 Zoll (2,54cm) bewegst, sendet sie 2000 mal ein Positionsupdate zum PC. In was das letztlich umgesetzt wird, also die tatsächliche Geschwindigkeit wird dann erst frühestens im Treiber umgesetzt. Es steht einem ja frei ein solch ein "Update-Tick" als 1 Pixel oder 10, oder auch nur 0,1 zu interpretieren.
Eine Maus mit 1000 DPI kann also genau so "schnell" (lies: Cursor, bei gleich weiter physischer Bewegung der Maus selbst, um gleich viele Pixel verschoben) wie eine mit 2000 DPI gemacht sein.

Was in diesem Zusammenhang gemeint ist, ist dass man bei Bildschirmen im Allgemeinen von ca. 72 DPI Auflösung ausgeht, so dass der Cursor, wenn er sich um 72 Pixel bewegt hat, auf der Bildfläche mit einem Lineal nachgemessen ca. 1 Zoll zurückgelegt hat. Das ist aber nur ein (ziemlich) grober Schätzwert, da die DPI von Bildschirm zu Bildschirm und je nach Auflösung teils erheblich abweichen.
Damit kommt man aber zumindest schon mal so weit, dass man ungefähr sagen kann wie viel Strecke der Cursor (nicht die Maus!!!) gemacht hat.

Um die tatsächliche Maus-Strecke zu bekommen, brauchst du noch mehr Infos: 1) Die DPI der Maus, 2) Den Umrechnungsfaktor der via Treiber (und ggf. nachträglich noch durch's OS) angewendet wird. Der ist allerdings der Knackpunkt: Er kann variabel sein, man schaue sich mal die Option der verbesserten Mausbeschleunigung an.

Im Grunde ist es also fast schon egal was du wo und wie berechnest, da mit vertretbarem Aufwand für solch eine sinnfreie Spielerei ohnehin nur arg grobe Schätzungen dabei heraus kommen. Es sei denn du willst die Bewegung des Cursors in Pixeln - das geht mit o.g. Mitteln sehr genau :)

\\Edit: Ich glaube wenn du einen globalen LowLevel-Maushook einrichtest, bekommst du wirklich für jeden Tick den die Maus sendet einen Callback fällt mir gerade ein! Wenn du das mit den DPI der Maus verrechnest, kommst du denke ich doch schon recht nah dran, ohne den Umweg über die Umrechnungsstufen "Treiber und Windows Mauseinstellungen".

Clemens L. 27. Sep 2009 23:13

Re: [FRAGE]Mousometer
 
Zitat:

Zitat von Medium
\\Edit: Ich glaube wenn du einen globalen LowLevel-Maushook einrichtest, bekommst du wirklich für jeden Tick den die Maus sendet einen Callback fällt mir gerade ein! Wenn du das mit den DPI der Maus verrechnest, kommst du denke ich doch schon recht nah dran, ohne den Umweg über die Umrechnungsstufen "Treiber und Windows Mauseinstellungen".

Ich hab vor einem halben Jahr oder so einen zu diesem Zweck geschrieben, und konnte ganz deutlich erkennen, das wenn ich die Maus richtig schnell bewege, ungefähr ein drittel der Bewegung verloren geht.

Ich weiss jetzt außerdem nicht, ob ich die Frage richtig verstanden hab: Geht es jetzt um die Strecke die der Cursor auf dem Bildschirm in CM zurücklegt oder die Maus auf dem Schreibtisch? :gruebel:

XXcD 27. Sep 2009 23:19

Re: [FRAGE]Mousometer
 
Eigentlich ging es um die maus, aber die Idee hab ich schon wieder übern Tisch geworfen da gibt es einfach zu viele Probleme.

Also ich setze mich jetzt mal dran und schreib da was um die Strecke des Cursor zu berechnen.

himitsu 27. Sep 2009 23:59

Re: [FRAGE]Mousometer
 
Im Grunde ist das mit der Maus relativ ähnlich, vorallem da hier eh ständig kleine Rundungsfehler reinkommen werden.

Statt mit den DPI zu rechnen könntest du dann einfach einen sebst errechneten/gemessen Wert rechnen.

z.B. man nehme ein A4 Blatt und bewege die Maus darüber ... also z.B. eine Seite der Maus von einem Blattende zum Anderen beweden und Pixel messen ... dann hast du Pixel/cm


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz