Raw Input für die Maus

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Raw Input für die Maus

Beitrag von Niki »

Wie einige schon gemerkt haben dürften komme ich, was gewisse Bereiche der Windows PC Entwicklung anbelangt, ein wenig aus der Steinzeit.

Ich wusste bis gestern z.B. nichts von der Raw Input API. Kein Witz! Erst Krishty's Artikel hat mir das vor Augen geführt. Und was find ich da in der API? Die praktisch einfachste Form relative Mausbewegungen abzufragen, die ich bis jetzt in der WinAPI gesehen habe. Simpelst zu implementieren.

Nur...

Ich würde ja schon gerne wissen wie viele Knöpfe meine Maus hat, und wie hoch die Abtastrate ist. Da rufe ich also GetRawInputDeviceInfo auf. Die Abtastraten-Information in RID_DEVICE_INFO_MOUSE wird nicht von allen Mäusen unterstützt (bei mir z.B. immer 0). Auch hat meine Maus lt. RID_DEVICE_INFO_MOUSE ganze 16 Tasten. Hat jemand eine Logitech MX Laser und kann mir sagen wo die 7 Tasten sind die ich nicht finden kann?

Aber Spaß beiseite... gibt's eine Möglichkeit an korrekte Informationen ranzukommen?
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: Raw Input für die Maus

Beitrag von Terep »

Es gibt von Charles Petzold das Buch Windowsprogrammierung.
Darin wirst Du bestimmt alles finden.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Petzold's Bücher waren schon früher klasse. Aber in diesem speziellen Fall bin ich mir nicht so sicher ob das hier in den Rahmen seiner Bücher fällt :)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Schrompf »

Ne, sorry. RawInput meldet Dir wohl nur die Sachen, die die Geräte an das Betriebssystem melden. Und da nehmen es die Hersteller anscheinend nicht so genau...

Ich bekomme bei Splatter zum Start etwa fünf Mäuse und nochmal soviele Tastaturen gemeldet. Darunter sind einige Geistermäuse, die irgendwelche Remote Desktop-Anwendungen intern angelegt haben. Darunter sind auch PS2-Geräte, die gern mal völlige Phantasie-Zahlen an Buttons ausweisen. Und dann gibt es USB-Geräte, die meistens, aber nicht immer, sinnvolle Angaben liefern.

Wenn Du übrigens die freundliche Methode der RawInput-Mausabfrage nimmst, kriegst Du eh nur 5 Maustasten. Für alles andere hätten die Volldeppen mal mehr als 16Bit für die Flags reservieren müssen, und das geht ja in Zeiten von x GB Hauptspeicher nun wirklich nicht!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Schrompf hat geschrieben:Ich bekomme bei Splatter zum Start etwa fünf Mäuse und nochmal soviele Tastaturen gemeldet. Darunter sind einige Geistermäuse, die irgendwelche Remote Desktop-Anwendungen intern angelegt haben. Darunter sind auch PS2-Geräte, die gern mal völlige Phantasie-Zahlen an Buttons ausweisen. Und dann gibt es USB-Geräte, die meistens, aber nicht immer, sinnvolle Angaben liefern.
Kein Witz? Ich krieg hier grad voll den Lachkrampf :lol:

Aber vielleicht denke ich einfach mal wieder falsch. Bei Abtastraten stelle ich es mir so vor, dass eine HD-Maus kleinere Bewegungswerte meldet als eine Standardmaus, aber dafür wahrscheinlich eine größere Anzahl an Bewegungswerten. Ist das korrekt?
Ich frage, weil ich Bewegungswerte in einem History-Array speichere um ein Maus-Smoothing zu berechnen (Summe von gewichteten Bewegungswerten). Ich könnte mir vorstellen, dass das Ergebnis wesentlich von der Abtastrate abhängig ist. Oder liege ich da falsch?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Schrompf »

Ja, das stimmt. Aber besonders die gemeldeten Abtastraten halte ich für Phantasie-Werte. Schreib Dir einfach mal alle Geräte, die Du detektierst, ins Log, und schicke dann die Testanwendung an Freunde und Bekannte. Damit bekommst Du ein Gefühl dafür, wie weit Du den Daten trauen kannst.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Denk daran, dass die Abtastrate nicht nur räumlich, sondern auch zeitlich in Betracht gezogen werden muss, weil bei einer Hochleistungsmaus nicht nur größere Zahlen kommen, sondern auch mehr Nachrichten pro Sekunde.

Die Art und Weise, wie Windows den Raw Input in Zeigerbewegungen verwandelt, ist hier geschildert. Leider steht auch dort nicht, wo sie die Abtastrate herkriegen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Schrompf hat geschrieben:Schreib Dir einfach mal alle Geräte, die Du detektierst, ins Log, und schicke dann die Testanwendung an Freunde und Bekannte.
Keine schlechte Idee. Dann kann ich vielleicht auch eine halbwegs akzeptable Default-Einstellung für das Smoothing finden. Nicht das jemand das Game startet und die Maus ist total krank - selbst wenn's einstellbar ist.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Krishty hat geschrieben:Denk daran, dass die Abtastrate nicht nur räumlich, sondern auch zeitlich in Betracht gezogen werden muss.
Ja, ich habe schon gestern darüber nachgedacht die Framezeit mit einzuberechnen. Hab's aber noch nicht getan.

Den Artikel mit der Zeiger Ballistik habe ich auch gefunden und gelesen. Der Artikel ist übrigens ein Grund warum ich mir dachte, dass die Abtastrate doch irgendwo stehen muss.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

http://stackoverflow.com/questions/7182 ... on-windows
However, I think Windows is able to retrieve this value when mapping mouse movement onto the screen, otherwise, a 400 dpi mouse must act very differently comparing with a 1000 dpi mouse. Right? And the XP ballistics document also uses it in calculation. I imagine that there might be a way to retrieve this value from the system. – yzshen Aug 24 '11 at 21:15
High DPI mouses actually move the pointer faster so Windows lets the user adjust the mouse sensitivity in Control Panel. I think, you could go the same way. – RocketR Aug 24 '11 at 21:30
As @rocket says, 400 dpi mice do behave very differently from 1000 dpi mice. People with high DPI mice have to turn down their mouse sensitivity in Windows and in games that use raw input so that the cursor doesn't fly all over the place. – Brian Gordon Aug 24 '11 at 22:43
Also müsste für uns nur von Belang sein, wie wir an die Mausgeschwindigkeitseinstellung aus der Systemsteuerung kommen.

HKEY_CURRENT_USER\Control Panel\Mouse

Mal gucken, wie wir die in die Berechnung einfließen lassen müssen!

Aha. Du musst einfach den Wert, den du von Raw Input bekommst, durch MouseSensitivity dividieren; dann sind alle Nutzer von hochauflösenden Mäusen zufrieden :)

Jetzt frage ich mich nur, was die armen Leute machen, die eine 400-DPI-Maus und eine 1000-DPI-Maus gleichzeitig am selben System hängen haben …
Zuletzt geändert von Krishty am 15.04.2013, 20:44, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Schrompf »

Uff, das alles muss ich mal in meine Input-API umsetzen. Das wird aber erst im ersten Patch, fürchte ich.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Krishty hat geschrieben:HKEY_CURRENT_USER\Control Panel\Mouse

Mal gucken, wie wir die in die Berechnung einfließen lassen müssen!

Aha. Du musst einfach den Wert, den du von Raw Input bekommst, durch MouseSensitivity dividieren; dann sind alle Nutzer von hochauflösenden Mäusen zufrieden :)
Du bist einfach zu schnell für mich :D Wie findet man das so schnell in der Registry? Ich werde aber auch mal forschen ob es noch was anderes als Registry-Einträge gibt (ein WinAPI Funktion). Ich bin mir immer nicht sicher, in wie weit man einem Registry-Eintrag trauen kann.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Schrompf hat geschrieben:Uff, das alles muss ich mal in meine Input-API umsetzen.
Ich auch. Bevor Niki gefragt hat dachte ich auch noch, in Raw Input kämen Pixel an.
Niki hat geschrieben:Du bist einfach zu schnell für mich Wie findet man das so schnell in der Registry?
Habe nach ein paar Stichworten gesucht und irgendein Gamer-Forum gefunden, wo jemand seine Maus über den Wert der Systemsteuerung hinaus beschleunigen wollte. Dort war der Schlüssel geschildert.
Niki hat geschrieben:Ich werde aber auch mal forschen ob es noch was anderes als Registry-Einträge gibt (ein WinAPI Funktion).
Tu das; damit würde ich auch besser schlafen.
Niki hat geschrieben:Ich bin mir immer nicht sicher, in wie weit man einem Registry-Eintrag trauen kann.
Wenn ein Anwender auf die Idee kommt, bei einem Systemsteuerungswert wie diesem 0 einzutragen, ist er selber schuld, wenn die Anwendung nicht mehr funktioniert. Das wäre ja wie, in System32 DLLs zu ersetzen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

SystemParametersInfo() mit SPI_GETMOUSESPEED ??? Muss ich mal mit der Registry vergleichen.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Krishty hat geschrieben:Wenn ein Anwender auf die Idee kommt, bei einem Systemsteuerungswert wie diesem 0 einzutragen, ist er selber schuld, wenn die Anwendung nicht mehr funktioniert. Das wäre ja wie, in System32 DLLs zu ersetzen.
Es geht mir weniger darum, ob ein Anwender da rumfummelt. Viel interessanter ist ob Microsoft in einer neuen Windows Version plötzlich daher geht und z.B. den Eintrag umbenennt.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

SystemParametersInfo() mit SPI_GETMOUSESPEED gibt bei mir 10. Das stimmt mit der Registry überein. Aber ist wohl besser noch mehrere Werte zu prüfen.

EDIT: So ganz kann's das aber glaube ich noch nicht sein. Wenn ich die kleinen relativen Bewegungswerte durch 10 teile, dann gibt das Integer-mäßig fast immer 0.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Nein. Der Registry-Eintrag ist auch 1 für schnellste Bewegung und 10 für langsamste.

SystemParametersInfo() gibt hingegen was zwischen 1 und 20 zurück, ist also wahrscheinlich ein Multiplikator. Ändert sich der Wert, wenn du in der Systemsteuerung die Zeigergeschwindigkeit änderst?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Ja, hat sich in der Registry auf 4 geändert. Und SPI_GETMOUSESPEED gibt mir auch 4. Da muss man noch mehr testen denke ich. Nur ich bin grad durchs Kochen abgelenkt und mag kein schwarzes Essen.

EDIT: maximale Geschwindigkeit... Registry 20, SPI 20.

Ich frage mich was MouseSpeed in der Registry ist. Bis jetzt haben wir ja nur auf MouseSensitivity geschaut.

EDIT: http://technet.microsoft.com/en-us/libr ... 78664.aspx (wenn ich das richtig sehe, für uns uninteressant)
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Bei mir ändert sich in der Registry nur MouseSensitivity, wenn ich die Systemsteuerung anpasse. Dieser Beitrag zu Wine lässt vermuten, dass sie im dritten Ausgabeparameter von SPI_GETMOUSE stecken könnte …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Krishty hat geschrieben:Bei mir ändert sich in der Registry nur MouseSensitivity, wenn ich die Systemsteuerung anpasse.


Ja, das ist hier genau so.
Krishty hat geschrieben:Dieser Beitrag zu Wine lässt vermuten, dass sie im dritten Ausgabeparameter von SPI_GETMOUSE stecken könnte …
An der Stelle habe ich die jetzt den Zug verpasst. Welchen Gedankengang verfolgst du da?

EDIT: Achso! Ich glaube das gehört zu Pointer Ballistics für absolute Mauspositionen. Die Registry-Werte MouseSpeed, MouseThreshold1 und MouseThreshold2. Meinst du die könnten für uns interessant sein?
Zuletzt geändert von Niki am 15.04.2013, 21:39, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Dass der Wert, den wir suchen, vielleicht garnicht in SPI_GETMOUSESPEED steckt, sondern in SPI_GETMOUSE. Aber scheinbar gibt Wine bei Aufruf von SPI_GETMOUSESPEED direkt den MouseSensitivity-Registry-Wert zurück … also müsste der auch im Bereich 1…20 sein, oder? ich teste nochmal, ob ich den nicht missverstanden habe.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Nein. Ich poste den Link nochmal. Schau dir die Tabelle an. Werte 0 bis 2

http://technet.microsoft.com/en-us/libr ... 78664.aspx

Und ja... MouseSensitivity ist bei mir identisch zu SPI_GETMOUSESPEED. Beides Werte zwischen 1 und 20.
Zuletzt geändert von Niki am 15.04.2013, 21:41, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Ja hatte ich; Entschuldigung. Der Wert ist identisch mit SPI_GETMOUSESPEED und damit ist das kein Divisor, sondern ein Multiplikator. Ups :(

Jetzt ist die Frage, wie wir das umrechnen … Raw-Input-Delta mit dem SPI_GETMOUSESPEED-Wert multiplizieren und durch 10 teilen?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Auch ich glaube das SPI_GETMOUSESPEED da eine Rolle spiel. Verzwanzigfacht aber per Multiplikation die Geschwindigkeit, und das ist Gewaltig. Vielleicht muss die MouseSensitivty vor der Multiplikation durch 10 geteilt werden. Das macht durchaus Sinn, nur wie kann man sich da sicher sein?!


EDIT: Hahaha, ich kann nicht glauben das du 3 Minuten vor mir die selbe Idee hattest. Ich tippe wohl zu langsam.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

;)

Ich denke, das wäre der sinnvollste Weg: Wenn man eine „ganz normale“ 400-DPI-Maus mit mittlerer Mauseinstellung hat, entwickelt man damit sein Spiel. Spielt es jemand, der eine 1000-DPI-Maus hat, dann musste er vorher schon in der Systemsteuerung die Empfindlichkeit auf 4 runterstellen, und gemäß der Formel kommt dann auch im Spiel wieder die gleiche Geschwindigkeit raus wie bei der 400-DPI-Maus, mit der man entwickelt hat; nur eben präziser.

Sehr schön; dann werde ich das morgen direkt implementieren.

Ich habe das übrigens noch in keinem Tutorial gefunden; wir sollten das irgendwo verewigen ;) Aber lass uns noch ein paar Tage abwarten bis du mit Tastatur und Maus fertig bist und ich mit Game Controllern; wir werden sicher noch mehr finden.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Ja, ich bin mit der Lösung auch einverstanden. Theoretisch kann man die Korrektheit sogar per Augenmaß überprüfen. Ein 2D Spiel mit relativer Mausbewegung langsam scrollen (also unter dem Acceleration Threshold bleiden). Und dann mit der Windows Maus optisch Pi mal Daumen vergleichen.

Ok, da machen wir dann noch einen Raw Input für Mäuse Artikel.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Mir ist eingefallen, dass die Mausbewegung ja sowieso immer zu irgendeiner Betrachterrotation oder Ähnlichem umgerechnet wird. Da hängt sowieso irgendwo künstlerische Freiheit in der Formel. Die Integer-Division durch 10 kann man sich dann sparen; arbeitet einfach direkt mit den skalierten Device-Werten; und gleicht das in einer eh vorhandenen Konstanten bei der Umrechnung zu Winkeln aus.

Ich habe es eben implementiert – und ich kann mich nun tatsächlich mit Sub-Pixel-Genauigkeit umsehen. Geile Sache. Nun aber in die Heia.

Bild
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Ja, auf Grund der Betrachterrotation hatte ich ein 2D Scrolling als Beispiel genommen, um eine Übereinstimmung zu überprüfen. Du weißt schon... Windows Mouse Cursor sichtbar lassen. Und wenn er dann ungefähr am selben Pixel kleben bleibt, dann passt es halbwegs. Aber du hast schon recht, im 3D Raum gibt's die künstlerische Freiheit.

Gut zu hören das es bei dir prima klappt. Ich werde heute wohl nicht mehr dazu kommen. Muss mir auch noch über die Framezeit Gedanken machen, denn sonst ruckelt es immer ein wenig.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input für die Maus

Beitrag von Krishty »

Ich habe das Thema mal geteilt weil es nun weniger um Raw Input geht; hier geht es mit der Mausglättung weiter.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Raw Input für die Maus

Beitrag von Niki »

Nur zur Information... ich habe das mit dem 2D Scrolling ausprobiert. Bei SPI_GETMOUSESPEED=10 klebt der Mausezeiger 100%-ig am selben Pixel. Bei höheren Werten zieht das Scrolling nach, und bei kleineren Werten ist es zu schnell. Bei SPI_GETMOUSESPEED=20 und einer Bewegung des Mauszeigers von ~768 Pixeln kommt das zu einem Fehler von schätzungsweise 250 Pixeln. Also doch noch recht viel. Da muss also irgendeine Kurve noch dahinterstecken.

EDIT: Ich habe das Testprojekt mal als Anhang hochgeladen, für die die da probieren wollen. Der Code ist super Dreck, weil's ja auch nur ein schneller Test sein sollte. Die wesentliche Code-Stelle (in main.cpp) hat einen riesigen Kommentar. Linke Maustaste im Fenster drücken um zu scrollen. Achtung! In der Systemsteuerung muss "Zeigerbeschleunigung verbessern" aus, damit da keine Beschleunigung ist.
Dateianhänge
SensitivityTest.zip
(5.92 KiB) 311-mal heruntergeladen
Antworten