本文目錄一覽:
- 1、C語言鍵盤內容讀取
- 2、c語言怎樣判斷鍵盤按鍵的按下、釋放?
- 3、在c語言中什麼函數能實現識別鍵盤上的按鍵?
- 4、c語言中如何識別鍵盤輸入的方向鍵?
- 5、c語言如何識別鍵盤按鍵的長按與抬起動作,求助
C語言鍵盤內容讀取
綜觀TC提供的鍵盤輸入函數,以bioskey函數為最合適選擇。
int bioskey(int cmd);
使用BIOS中斷0x16執行各種鍵盤操作。參數cmd確定實際得操作。
bioskey的返回值由cmd決定:
0:低8位非0,返回在隊列中等待的下一輸入鍵的ascii字符或鍵盤的下一次按鍵輸入的ascii字符。低8位為0,則高8位為擴展鍵盤碼。
1:測試是否有可讀的輸入鍵,為0,則沒有。Ctrl_break 返回0xffff(-1)。否則,返回下一個輸入鍵。鍵值還保存,供下次cmd=0時bioskey調用返回。
2:請求當前換檔鍵狀態。狀態值由下列值相或(or)得到:
位7 0x80 Insert ON
6 0x40 Caps ON
5 0x20 Numlock ON
4 0x10 Scroll Lock ON
3 0x08 ALT
2 0x04 CTRL
1 0x02 – SHIFT
0 0x01 – SHIFT
為了方便起見,我們首先定義一些常用功能鍵的鍵值。
#define ReturnKey 0x0d
#define ESC 0x1b
#define Back 0x08
#define LeftArrow 0x4b00
#define RightArrow 0x4d00
#define UpArrow 0x4800
#define DownArrow 0x5000
#define PageUp 0x4900
#define PageDown 0x5100
#define Home 0x4700
#define End 0x4f00
#define F1 0x3b00
#define F2 0x3c00
#define F3 0x3d00
#define F4 0x3e00
#define F5 0x3f00
#define F6 0x4000
#define F7 0x4100
#define F8 0x4200
#define F9 0x4300
#define F10 0x4400
int GetKey(void)
{
int tKey;
while(bioskey(1)==0)
;
tKey=bioskey(0);
if ((tKey 0xff)!=0)
tKey=tKey 0xff;
return tKey;
}
以上代碼,可基本完成常用程序鍵盤讀取操作。
但我們必須注意到,對於函數GetKey的定義中,bioskey函數的使用,我們只是對cmd=0,1的情況進行了處理,而對於cmd=2,也即換檔鍵狀態沒有進行處理,因而諸如ctrl-home等等GetKey不能進行相應的接收,如果確實需要,須繼續擴充GetKey函數。
c語言怎樣判斷鍵盤按鍵的按下、釋放?
C語言判斷鍵盤按下和釋放,是通過檢測該鍵的狀態來實現的。如果是單一的一個按鍵,那麼直接檢測該鍵是「1」還是「0」,就可以確定是按下還是釋放。如果是矩陣鍵盤,那麼需要發送掃描碼,再檢測輸入值,來判斷鍵盤中鍵的狀態。以下舉例說明:
bit keychk() //單一按鍵檢測
{
if(P1.0==0) //如果鍵按下
{
delay(); //延時去抖
if(P1.0==0)return(1); //返回鍵狀態
}
return(0);
}
unsigned char kbscan(void) //矩陣掃描按鍵檢測
{
unsigned char sccode,recode;
P1=0x0f; //發0掃描,列線輸入
if ((P2 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P10x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode0x01)!=0)
{
P1=sccode;
if((P10x0f)!=0x0f)
{
recode=(P10x0f)|0xf0;
while((P10x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}
在c語言中什麼函數能實現識別鍵盤上的按鍵?
添加WM_KEYDOWN函數。在函數體中case WM_KEYDOWN: if (wParam==VK_LEFT)//方向鍵左 { rect1.left-=10; rect1.right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_RIGHT)//方向鍵右 { rect1.left+=10; rect1.right+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_UP)//方向鍵上 { rect1.top-=10; rect1.bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_DOWN)//方向鍵下 { rect1.top+=10; rect1.bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_PRIOR)//PG UP { rect1.top-=10; rect1.bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_NEXT)//PG DN { rect1.top+=10; rect1.bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_HOME)//HOME { rect1.left-=10; rect1.right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_END)//END { rect1.left+=10; rect1.right+=10; InvalidateRect (hWnd,NULL,TRUE); } break;
c語言中如何識別鍵盤輸入的方向鍵?
用windows API裏面有一個LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄
UINT uMsg, // 窗口的消息
WPARAM wParam, // 附加的消息內容
LPARAM lParam) // 附加的消息內容
這個消息響應函數,然後用switch語句對於 case WM_KEYDOWN:即鍵盤按下時的消息響應,這個時候再判斷傳進來的參數wParam的值,方向鍵對應鍵值分別為VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,下面是一個例子,你自己看看:
LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄
UINT uMsg, // 窗口的消息
WPARAM wParam, // 附加的消息內容
LPARAM lParam) // 附加的消息內容
{
switch (uMsg) // 檢查Windows消息
{
case WM_ACTIVATE: // 監視窗口激活消息
{
if (!HIWORD(wParam)) // 檢查最小化狀態 HIWORD取後面參數的高16位
{
active=TRUE; // 程序處於激活狀態
}
else
{
active=FALSE; // 程序不再激活
}
return 0; // 返回消息循環
}
case WM_SYSCOMMAND: // 系統中斷命令
{
switch (wParam) // 檢查系統調用
{
case SC_SCREENSAVE: // 屏保要運行?
case SC_MONITORPOWER: // 顯示器要進入節電模式?
return 0; // 阻止發生
}
break; // 退出
}
case WM_CLOSE: // 收到Close消息?
{
PostQuitMessage(0); // 發出退出消息
return 0; // 返回
}
case WM_KEYDOWN: // 有鍵按下么?
{
switch (wParam)
{
case VK_UP:
MOVEUP();
return 0;
}
}
case WM_KEYUP: // 有鍵放開么?
{
keys[wParam] = FALSE; // 如果是,設為FALSE
return 0; // 返回
}
case WM_SIZE: // 調整OpenGL窗口大小
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width,HiWord=Height
return 0; // 返回
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
希望對你有所幫助。
c語言如何識別鍵盤按鍵的長按與抬起動作,求助
在應用層實現應該用到windows.h;而在核心層可以不必用到bios.h和windows.h.單說記錄鍵盤動作在核心層實現的方法也是有許多種,講都講不完.你可以搜索:鍵盤驅動
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/286305.html