Okay, also im Grunde möchte ich Tastatur Text abrufen können. Wie die Eingabe von Text in ein Textfeld oder etwas. Ich schreibe nur mein Spiel für Windows. Ich habe die Verwendung von Guide.BeginShowKeyboardInput ignoriert, weil es das Gefühl eines eigenständigen Spiels unterbricht, und die Tatsache, dass der Guide immer XBOX-Schaltflächen anzeigt, scheint mir auch nicht richtig zu sein. Ja, es ist der einfachste Weg, aber ich mag es nicht.XNA - Tastatur Texteingabe
Als nächstes habe ich versucht mit System.Windows.Forms.NativeWindow. Ich habe eine Klasse erstellt, die von ihr geerbt hat und ihr das Handle-Fenster übergeben, die WndProc-Funktion implementiert, um WM_CHAR (oder WM_KEYDOWN) zu finden, obwohl WndProc für andere Nachrichten aufgerufen wurde, WM_CHAR und WM_KEYDOWN haben das nie getan. Also musste ich diese Idee aufgeben, und außerdem referenzierte ich auch die ganzen Windows-Formulare, was unnötigen Speicherbedarf bedeutete.
Also war meine letzte Idee, einen Thread-Level, Low-Level-Tastatur-Hook zu erstellen. Dies war bisher das erfolgreichste. Ich bekomme WM_KEYDOWN Nachricht, (noch nicht WM_CHAR versucht) den virtuellen Schlüsselcode mit Win32 Funktion MapVirtualKey zu einem Zeichen zu übersetzen. Und ich bekomme meinen Text! (Ich drucke gerade mit Debug.Write im Moment)
Ein paar Probleme obwohl. Es ist, als hätte ich eine Feststelltaste und eine nicht reagierende Umschalttaste. (Natürlich ist es nicht, es gibt nur einen virtuellen Schlüsselcode pro Schlüssel, also hat es nur einen Ausgang) und es fügt einen Overhead hinzu, da es sich an die Windows-Hook-Liste anfügt und nicht so schnell ist wie ich D wie es sein soll, aber die Langsamkeit könnte mehr auf Debug.Write zurückzuführen sein.
Hat sich noch jemand angesprochen und es gelöst, ohne auf eine Bildschirmtastatur zurückgreifen zu müssen? oder hat jemand weitere Ideen, die ich ausprobieren kann?
danke im voraus.
Frage von Jimmy fragte
Vielleicht verstehen Ich bin nicht die Frage, aber warum können Sie verwenden nicht die XNA Keyboard und KeyboardState Klassen?
Mein Kommentar:
Es ist, weil wenn Sie keystates lesen können, Sie keinen Zugriff auf getippten Text bekommen, wie und wie sie durch den Benutzer eingegeben wird.
Also lassen Sie mich weiter klären. Ich möchte implementieren, in der Lage zu sein, Texteingabe vom Benutzer zu lesen, als ob sie in Textbox Windows eingibt. Die Keyboard- und die KeyboardState-Klasse erhalten die Zustände aller Schlüssel, aber ich müsste jeden Schlüssel und jede Kombination seiner Zeichendarstellung zuordnen. Dies fällt um, wenn der Benutzer nicht die gleiche Tastatursprache wie ich speziell mit Symbolen verwende (meine doppelten Anführungszeichen ist Shift + 2, während amerikanische Tastaturen ihre irgendwo in der Nähe der Return-Taste haben).
es scheint mein Fenster Haken war der Weg zu gehen, nur der Grund, warum ich nicht WM_CHAR bekommen ist, weil die XNA Meldungsverteilschleife Nachricht nicht übersetzen macht.
Hinzufügen von Translate in wann immer ich eine WM _
keyDown Nachricht empfangen bedeuten, dass ich meine WM_CHAR Nachricht bekam, habe ich dann dies ein Zeichen eingegeben Ereignis in meiner MessageHook Klasse zu feuern, die meine tastaturpuffer Klasse abonniert hatten, das dann, dass die Puffer auf einem Text-Puffer: D (oder StringBuilder, aber das Ergebnis ist das gleiche)
So habe ich alles funktioniert, wie ich will.
Vielen Dank an Jimmy für einen Link zu einem sehr informativen Thread.
Es liegt daran, obwohl Sie Keystates lesen können, können Sie nicht zugreifen, um Text eingegeben wie und wie es vom Benutzer eingegeben wird. – Sekhat
Ah ich sehe. In der Vergangenheit habe ich eine Utility-Klasse für diesen Zweck geschrieben, ähnlich der auf http://www.gamedev.net/community/forums/topic.asp?topic_id=457783 – Jimmy
Danke, es scheint, mein Fenster Hook war Der Weg zu gehen, nur der Grund, warum ich WM_CHAR nicht erhalten habe, ist, weil die XNA-Nachrichtenpumpe keine Nachricht übersetzt. Ich werde eine Geige herum und sehen, was ich sonst noch bekommen kann :) – Sekhat