2013-10-23 167 views
0

我想確定是否有可能將箭頭鍵轉換爲寬字符。我爲它的getch()函數使用了conio.h,我只是喜歡它與類似函數相比的工作原理,並且必須調用兩次才能檢索箭頭鍵。箭頭鍵爲寬字符

箭頭鍵按下時返回取0xE0(-32)作爲第一個字符,然後{左= 'K',UP = 'H',右= 'M',唐氏= 'P'}

所以我一直在試圖找到一種方法將兩個字符合併爲一個。這是我想出的最接近的東西。功能鍵雖然不起作用,但無論按下功能鍵,它總是返回相同的值。 {F1-12 = 0,箭頭= 224}我拉出了可信窗口計算器,並能夠確定224等於-32二進制。我只是把它放到一個字節,並使用十進制系統,去了100 + 124,它是= -32。

所以也許有人可以幫我弄清楚爲什麼轉換隻考慮數組中的第一個字符。我一定做錯了什麼。如果是這樣,現在就是代碼,那麼說話太多了,抱歉太久了。

#include <iostream> 
#include <stdio.h> 
#include <windows.h> 
#include <wincon.h> 
#include <conio.h> 
#include <cwchar> 

/**int main() 
{ 
    int N; 
    char C; 
    wchar_t R; 

    while(true) 
    { 
     while(!kbhit()){} 
     //C = getch(); 

     //if((R == 0) || (R == 224)) 

     std::cout << R << std::endl; 
     N = R; 
     std::cout << R << " = " << N << std::endl; 
    } 
}*/ 



int main() 
{ 
    int N = 0; 
    char C[2]; 
    wchar_t R; 
    mbstate_t mbst; 

    while(true) 
    { 
     mbrlen(NULL,0,&mbst); 
     memset(&mbst,0,sizeof(mbst)); 

     for(int i = 0; i < 2; ++i) 
     { 
      while(!kbhit()){} 
      C[i] = getch(); 
      N = C[i]; 
      switch(N) 
      { 
       case 0: 
        break; 
       case -32: 
        break; 
       default: 
        //input needs to be converted 
        mbrtowc(&R,C,2,&mbst); 
        N = R; 
        std::cout << R << " = " << N << std::endl; 
        i = 3; 
        break; 
      } 
     } 
    } 
} 

編輯:

我找到了一種方法來使用工會的2個字節結合起來。當我發佈這個消息時,我不知道工會是什麼。聯合允許我爲兩種不同的數據類型使用相同的內存空間。它是如何工作的 - http://www.cplusplus.com/doc/tutorial/other_data_types/

回答

0

我能夠解決我自己的問題,但不是我一直在嘗試的方式。如果有人想幫助弄清楚我做錯了什麼,那會很棒。

但是,只要將每個鍵都作爲唯一的2字節變量讀取,我就能夠解決問題。我發現了一個關於移位的問題,並用它來結合我的兩個字符。然後我發現數字沒有合併,我發現這是因爲我使用了帶符號的字符而不是無符號的字符。我不想使用無符號的字符,所以我找到了一個使用聯合的新解決方案。

這是我的工會解決方案。這很簡單。

#include <iostream> 
#include <conio.h> //getch() & kbhit() 
#include "rndgen.h" 
#define FN_ESCAPE 27 
#define FN_UP_ARROW 18656 
#define FN_DOWN_ARROW 20704 
#define FN_LEFT_ARROW 19424 
#define FN_RIGHT_ARROW 19936 
                    //This union allows for two 8-bit values to be read as one 16-bit value 
union wide_char 
{ 
    short wide_C; 
    char C[2]; 
}; 
                    //Function waits for a key to be pressed 
inline short key_wait() 
{ 
    wchar_t R; 
    wide_char user_input; 
    user_input.wide_C = 0; 
                //Loop twice, or until code causes the loop to exit 
                 //Two times are neccessary for function keys unfortunately 
    for(int i = 0; i < 2; ++i) 
    { 
               //While there isn't a key pressed, loop doing nothing 
     while(!kbhit()){} 
               //Grab the next key from the buffer 
                //Since the loop is done, there must be at least one 
     user_input.C[i] = getch(); 
     switch(user_input.C[i]) 
     { 
      case 0: 
      case -32: 
               //The key pressed is a Function key because it matches one of these two cases 
                //This means getch() must be called twice 
                //Break switch, run the for loop again ++i 
       break; 
      default: 
       R = user_input.wide_C; 
       return R; 
       break; 
     } 
    } 
    return -1; 
} 

的wide_C返回C [2]在該順序{C [1],C [0]}這是很大的,因爲這意味着F1-12可以唯一被讀取(第一炭返回的位對於F1-12,它的值爲0)也許可以用wchar_t取代short,但我想明白爲什麼要修復一些沒有被破壞的東西。如果我決定在不同的程序的新解決方案中重新實現代碼,我可能會這樣做。

這也意味着a-Z & 0-9都可以作爲它們的常規char值讀取。