顯示器文本模式
鍵盤生成通碼,斷碼->bios/操作系統接收通碼,斷碼,邏輯處理是產生一個字符還是組合鍵,功能鍵,->如果是字符則數據應該是放在應用程序提供的緩存地址上並且發送字符到顯示器緩存地址,顯示->按回車的時候,應用程序繼續執行
圖形模式
有ime的情況:
鍵盤生成通碼,斷碼->bios/操作系統接收通碼,斷碼->應用程序接收->ime先接收顯示->ime處理通碼,斷碼,在界面上展示輸入的字符並顯示輸入待選內容->應用程序接收ime最終確定的字符(unicode編碼)->轉成自己需要的字符存儲在程序->轉成unicode發送到顯示緩存
無ime的情況:
鍵盤生成通碼,斷碼->bios/操作系統接收通碼,斷碼->應用程序接收->處理通碼,斷碼,並轉成自己需要的字符存儲在程序->轉成unicode發送到顯示緩存
組合鍵,是操作系統或者程序自己根據邏輯判斷出來的。沒有斷碼之前,存着這個字符,再有一個通碼產生的時候,算是組合鍵產生。
一個邏輯例子:鍵盤A按下,一直產生通碼,按下B,則A不再產生通碼,B開始一直產生通碼,松開B,B產生斷碼,A不會恢復產生通碼,松開A,A產生斷碼。
chrome,gdi,還有其他圖形編程都有keypress事件,可能是從操作系統繼承來的事件。
<html> <head> <title></title> </head> <script type="text/javascript"> var isAlt = 0; var isEnt = 0; document.onkeydown = function(e){ var evn = e||event; var code = evn.keyCode||evn.which||evn.charCode; if(code==13){ isEnt = 1; } if(code==18){ isAlt = 1; } // 判讀Alt+Enter組合鍵 if(isAlt==1&&isEnt==1){ console.log("Alt+Enter"); }else if(isAlt==1&&isEnt==0){ console.log("Alt"); }else if(isAlt==0&&isEnt==1){ console.log("Enter"); } console.log(e); } document.onkeypress = function(e){ console.log(e); } document.onkeyup = function(e){ console.log(e); if(e.keyCode==13){ isEnt = 0; } if(e.keyCode==18){ isAlt = 0; } } </script> <body> </body> </html>
linux測試中斷次數
目前是152次,切換到虛擬里(切換的時候用鼠標操作,不要用鍵盤),按下a鍵10次,再次查看
可以得出驗證每次按鍵有兩次中斷產生,也可以看出key press應該是操作系統或者應用程序自己產生的。