好吧,所以基本上我想能夠檢索鍵盤文本。就像在文本字段中輸入文本一樣。我只爲Windows編寫我的遊戲。 我已經忽略了使用Guide.BeginShowKeyboardInput,因爲它打破了自包含遊戲的感覺,而且指南總是顯示XBOX按鈕的事實對我來說也不合適。是的,這是最簡單的方法,但我不喜歡它。XNA - 鍵盤文本輸入
接下來我嘗試使用System.Windows.Forms.NativeWindow。我創建了一個繼承自它的類,並將其傳遞給遊戲窗口句柄,實現了WndProc函數來捕獲WM_CHAR(或WM_KEYDOWN),儘管WndProc被其他消息調用,WM_CHAR和WM_KEYDOWN從未做過。所以我不得不放棄這個想法,此外,我還引用了整個Windows窗體,這意味着不必要的內存佔用膨脹。
所以我最後的想法是創建一個線程級別,低級別的鍵盤鉤子。迄今爲止,這是最成功的。我得到了WM_KEYDOWN消息,(還沒有嘗試過WM_CHAR)將虛函數與Win32函數MapVirtualKey轉換爲字符。我得到我的文本! (我現在只是用Debug.Write打印)
雖然有一些問題。就好像我鎖定了大寫字母,並且沒有響應的切換鍵。 (當然不是,每個鍵只有一個虛擬鍵碼,所以翻譯它只有一個輸出),它增加了開銷,因爲它將自己附加到Windows鉤子列表中,並且不像我' d喜歡它,但緩慢可能更多由於Debug.Write。
有沒有其他人接近這個並解決它,而不必訴諸於屏幕鍵盤?還是有人有進一步的想法讓我嘗試?
在此先感謝。
問題吉米
問也許我不理解的問題,但爲什麼不能使用XNA鍵盤和KeyboardState類?
我的評論:
這是因爲雖然你可以閱讀keystates,你不能獲得輸入的文字作爲以及它是如何由用戶輸入。
所以讓我進一步澄清。我想實現能夠從用戶讀取文本輸入,就好像他們正在輸入文本框是Windows一樣。鍵盤和KeyboardState類獲得所有鍵的狀態,但我必須將每個鍵和組合映射到它的字符表示。當用戶不使用與我特別使用相同的鍵盤語言(當我的雙引號是shift + 2,而美國的鍵盤有他們的位置在返回鍵附近的某處)時,這種情況會發生。
看來我的窗口鉤子是要走的路,只是我沒有得到WM_CHAR的原因是因爲XNA消息泵沒有做翻譯的消息。
中,每當我收到了WM _
KEYDOWN消息意味着我得到了我的WM_CHAR消息添加的TranslateMessage,然後我用這個在我的KeyboardBuffer類曾訂閱我的MessageHook類,然後緩存是一個火一個字符輸入事件文本緩衝區:D(或StringBuilder,但結果是相同的)
所以我有這一切工作,因爲我想。
非常感謝吉米提供了一個非常翔實的主題鏈接。
這是因爲雖然您可以閱讀關鍵狀態,但無法訪問鍵入的文本以及用戶如何鍵入文本。 – Sekhat 2008-12-17 17:29:29
啊我明白了。在過去,我爲此寫了一個工具類,類似於http://www.gamedev.net/community/forums/topic.asp?topic_id=457783 – Jimmy 2008-12-17 17:40:21
的工具類謝謝,它似乎是我的窗口鉤子要走的路,只是我沒有得到WM_CHAR的原因是因爲XNA消息泵不會翻譯消息。我將有一個小提琴,看看我能得到什麼:) – Sekhat 2008-12-18 09:55:24