2009-08-10 5 views
1

Ich schreibe gerade eine C++ - Konsolenanwendung, die die Mausposition in regelmäßigen Abständen erfasst und an eine andere visuelle Anwendung sendet, wo 3D-Grafiken in Echtzeit angezeigt werden . Die visuelle App ist eine geschlossene Quelle und kann außerhalb ihrer eingeschränkten Plug-in-Funktionalität nicht geändert werden.Mausposition ohne Begrenzung durch Bildschirmgröße, C++ & Windows

Derzeit verwende ich die GetCursorPos() -Funktion, die einfach und schnell genug ist, aber ich bin auf das Problem, dass alle Daten basierend auf der aktuellen Bildschirmauflösung von 1920x1600 abgeschnitten wird, so dass alle X-Werte sind zwischen 0 und 1920 und alle y-Werte liegen zwischen 0 und 1600, egal wie weit die Maus bewegt wird.

Ich brauche die Mausposition, bevor sie am Rand des Bildschirms abgeschnitten wird, oder möglicherweise die Deltas, die ich verwenden könnte, um die aktuelle Position zu berechnen.

Ich habe einige Verweise auf das Windows MouseMove-Ereignis gesehen, aber ich würde wirklich nicht ein Fenster implementieren wollen, damit es funktioniert oder es speziell als das aktive Ereignis erhalten.

Ich arbeite in einer Windows-Umgebung und eine Sprachänderung ist nicht machbar.

+0

Ich weiß nicht, aber ich stelle mir vor, Sie müssten eine Art Gerätetreiber schreiben, um diese Informationen zu erhalten –

Antwort

1

Ich habe keine direkte Erfahrung mit Roh-Eingabe, die Sie wahrscheinlich brauchen, um zu erschließen. According to MSDN, müssen Sie das Gerät registrieren, richten Sie dann Ihr winproc ein, um die WM_INPUT-Nachrichten zu akzeptieren, und führen Sie dann Ihre Berechnungen basierend auf den Rohdaten durch.

Hier ist another relevant link.

+0

Zurück in den schlechten alten Tagen von DOS und seriellen Mäusen, ich würde nur die serielle Schnittstelle zur Maus öffnen und das Protokoll für solche Aufgaben erhalten. Aber die Neuzentrierung der Maus (andere Antworten) ist wahrscheinlich die bessere Methode. –

2

Nehmen Sie einfach die Position, und sie in die Mitte und zurück das Delta selbst

Dies ist, wie FPS Spiele, die es tun

5

Ich könnte falsch sein, aber in Win32 landen Sie nicht Maus erhalten Verschieben Sie Nachrichten, wenn sich die Maus am Rand des Bildschirms befindet, da sich die Maus nicht bewegt. Der übliche Weg, eine unendliche Maus Bereich zu erhalten, ist folgendes zu tun:

  1. Ausblenden der Maus, erhalten exklusiven Zugriff und Datensatzposition
  2. Zentrum Maus Fenster
  3. Wenn die Maus bewegt, bekommen Delta von Mitte Bildschirm aktuelle Position
  4. Zentrum Maus zu Fenster wieder
  5. Die Bewegung nächste Maus (0,0) ein Delta von haben soll, so ist es
  6. Go ignorieren bis 3 bis zum Ende der Mausbewegungsoperation
  7. Reset-Position, zeigen die Maus und lassen Sie exklusiven Zugang

Wenn Sie die Maus nicht verhehlte, dann würden Sie die Maus zu bewegen um eine kleine Strecke sehen und dann wieder in die Mittelposition schnappen, die böse aussieht .

Diese Methode erfordert eine Nachrichtenpumpe für die Mausbewegung Nachrichten, damit die Konsolenanwendungsidee wird wahrscheinlich nicht damit arbeiten. Kannst du ein unsichtbares Fenster im Vollbildmodus erstellen, um die Maus zu greifen?

+0

Es gibt nichts, das verhindert, dass ein Konsolenprogramm eine Nachrichtenpumpe hat oder Fenster erzeugt.Aber eine Konsole selbst wäre ziemlich sinnlos, da es so klingt, als ob dieses Programm keine Texteingabe oder -ausgabe haben soll. –

+0

Sie können 'GetCursorPos' /' SetCursorPos' in einer Schleife verwenden (mit 'Sleep's dazwischen), um denselben Effekt zu erzielen. Nicht eine nahtlose Lösung, aber wird wahrscheinlich funktionieren. – Nick

Verwandte Themen