在程序中使用功能鍵和箭頭鍵可以使程序更容易使用。箭頭鍵可用來移動光標,而功能鍵使用戶能做一些特殊的事情,還可用來替代一些經常要鍵入的字符序列。
然而,與其它“特殊”功能一樣,C語言本身并沒有提供讀入功能鍵和箭頭鍵的標準方法。用scanf()來接受這些特殊字符是不可取的,同樣,用getchar()也不行。為此,你需要編寫一個小函數,讓它向DOS詢問被按下的鍵的值。請看下例:
??? #include<dos.h>
??? int GetKey()
??? {
?????? union REGS in,out;
?????? in.h.ah=0x8;
?????? int86(0x21,&in,&out);
?????? return out.h.al;
??? }
這種方法跳過C的輸入/輸出庫,直接從鍵緩沖區中讀取下一個鍵。這樣做的好處是不會漏掉特殊的鍵碼,并且所按的鍵能立即得到響應,而不用先存到緩沖區中,等到按下Enter鍵時才得到響應。
通過這個函數你可以得到所按的鍵的整數值鍵碼。請看下面這個測試程序:???
# include <stdio. h>
# include <dos. h>
int GetKey()
????? union REGS in, out ~
????? in. h. ah = 0xS~
????? int86( 0x21, &in, &out );
????? return out. h. al;
int main()
{
????? int c ;
????? while (?? c=GetKey() ) !=27 )
???????????????????? / * Loop until escape is pressed */
???? {
????????? printf ("Key = %d.\n" , c );
???? }
?????? return 0 ;
}
如果你鍵入一個字符串,那么上述程序可能會輸出這樣的結果:
??? key = 66.
??? key=111.
??? key=98.
??? key=32.
??? key=68.
??? key=111.
??? key=98.
??? key=98.
??? key=115.
當你按下功能鍵或箭頭鍵時,將發生不同的情況:你所看到的將是一個0,其后跟著一個字符值。這就是特殊鍵的表示方法:在一個0值后面跟著一個特殊的值。
因此,你可以用兩種方法來處理特殊鍵。首先,你可以檢測GetKey()的返回值,一旦檢測到一個0,你就按特殊的方式去處理GetKey()讀入的下一個字符。其次,你可以在GetKey()中檢測讀入的字符值,一旦檢測到一個0,就接著讀入下一個字符值,然后按某種方式修改這個值,并返回修改后的值。第二種方法比第一種方法更好。下面是一個改進了的GetKey()函數:
/*??
New improved key-getting function.
*/
int GetKey()
????? union REGS in, out;
????? in. h. ah = 0x8;
????? int86( 0x21, &in, &out );
????? if (out. h. al == 0 )
??????????? return GetKey ( ) + 128 ;
????? else
??????????? return out. h. al ;
這種方法中更清晰也最有效,它使程序無需檢查是否讀入了特殊鍵,因此減輕了程序員的工作量。在這種方法中,特殊鍵的值總是大于128。
然而,與其它“特殊”功能一樣,C語言本身并沒有提供讀入功能鍵和箭頭鍵的標準方法。用scanf()來接受這些特殊字符是不可取的,同樣,用getchar()也不行。為此,你需要編寫一個小函數,讓它向DOS詢問被按下的鍵的值。請看下例:
??? #include<dos.h>
??? int GetKey()
??? {
?????? union REGS in,out;
?????? in.h.ah=0x8;
?????? int86(0x21,&in,&out);
?????? return out.h.al;
??? }
這種方法跳過C的輸入/輸出庫,直接從鍵緩沖區中讀取下一個鍵。這樣做的好處是不會漏掉特殊的鍵碼,并且所按的鍵能立即得到響應,而不用先存到緩沖區中,等到按下Enter鍵時才得到響應。
通過這個函數你可以得到所按的鍵的整數值鍵碼。請看下面這個測試程序:???
# include <stdio. h>
# include <dos. h>
int GetKey()
????? union REGS in, out ~
????? in. h. ah = 0xS~
????? int86( 0x21, &in, &out );
????? return out. h. al;
int main()
{
????? int c ;
????? while (?? c=GetKey() ) !=27 )
???????????????????? / * Loop until escape is pressed */
???? {
????????? printf ("Key = %d.\n" , c );
???? }
?????? return 0 ;
}
如果你鍵入一個字符串,那么上述程序可能會輸出這樣的結果:
??? key = 66.
??? key=111.
??? key=98.
??? key=32.
??? key=68.
??? key=111.
??? key=98.
??? key=98.
??? key=115.
當你按下功能鍵或箭頭鍵時,將發生不同的情況:你所看到的將是一個0,其后跟著一個字符值。這就是特殊鍵的表示方法:在一個0值后面跟著一個特殊的值。
因此,你可以用兩種方法來處理特殊鍵。首先,你可以檢測GetKey()的返回值,一旦檢測到一個0,你就按特殊的方式去處理GetKey()讀入的下一個字符。其次,你可以在GetKey()中檢測讀入的字符值,一旦檢測到一個0,就接著讀入下一個字符值,然后按某種方式修改這個值,并返回修改后的值。第二種方法比第一種方法更好。下面是一個改進了的GetKey()函數:
/*??
New improved key-getting function.
*/
int GetKey()
????? union REGS in, out;
????? in. h. ah = 0x8;
????? int86( 0x21, &in, &out );
????? if (out. h. al == 0 )
??????????? return GetKey ( ) + 128 ;
????? else
??????????? return out. h. al ;
這種方法中更清晰也最有效,它使程序無需檢查是否讀入了特殊鍵,因此減輕了程序員的工作量。在這種方法中,特殊鍵的值總是大于128。