第08章_鍵盤程序編程基礎_第1頁
第08章_鍵盤程序編程基礎_第2頁
第08章_鍵盤程序編程基礎_第3頁
第08章_鍵盤程序編程基礎_第4頁
第08章_鍵盤程序編程基礎_第5頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章鍵盤程序編程基礎 鍵盤和鼠標是兩個標準的用戶輸入來源 它們在輸入過程中起著互補作用 特別是在今天 鼠標在應用程序中的應用比十年前更為廣泛 甚至在應用程序中 我們更習慣于使用鼠標 例如在游戲 畫圖程序 音樂程序以及Web瀏覽器等程序中就是這樣 然而 在一般的PC機中 我們仍然不把鼠標當作必須設備 而把鍵盤作為必備設備 鍵盤是個人電腦的組件 鍵盤有非常久遠的歷史 它起源於1874年的第一臺Remington打字機 早期的電腦程序員用鍵盤在Hollerith卡片上打孔 後來在終端機上用鍵盤直接與大型主機溝通 PC上的鍵盤在某些方面進行了擴充 例如 加上了功能鍵 游標移動鍵和單獨的附加鍵盤 數字小鍵盤 但它們的輸入原理基本相同 8 1鍵盤輸入概論 早期的電腦程序員用鍵盤在Hollerith卡片上打孔 後來在終端機上用鍵盤直接與大型主機溝通 PC上的鍵盤在某些方面進行了擴充 例如 加上了功能鍵 游標移動鍵和單獨的附加鍵盤 數字小鍵盤 1 功能鍵 Alt F1 F10功能鍵是調動系統功能的按鍵應用程序一般不必關心 不必監視它們的消息交由Windows系統處理 即給DefWindowProc 函數處理 2 加速鍵原程序在資源里定義 即 與菜單項綁定 應用程序一般不必關心 不必監視它們的消息交由DefWindowProc 函數處理 8 1鍵盤輸入概論 3 Windows應用程序如何獲得鍵盤的輸入呢 鍵盤的輸入 敲鍵 鍵盤事件 發送到Windows系統 鍵盤消息 應用程序 8 1 1鍵盤的輸入焦點 能夠接收特定鍵盤消息的窗口稱為具有輸入焦點的窗口 那個窗口具有輸入焦點可以由Windows系統來決定 也可以由應用程序的窗口函數通過攔截WM SETFOCUS和WM KILLFOCUS消息來判定它的窗口何時擁有或刪除輸入焦點 程序從消息隊列中取出消息 該消息是一個MSG結構 此結構中的hwnd欄目就是指向接收此消息的窗口函數的指針 每個消息都有指向接收消息的hwnd 當然只有這個窗口的窗口函數接收此鍵盤消息 structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 消息名ID號WPARAMwParam 消息參數1LPARAMlParam 消息參數2DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 1 2系統消息隊列 應用程序消息隊列 用戶按下 釋放按鍵 Windows和鍵盤驅動程序 掃描碼 系統消息隊列 應用程序的消息序列 鍵盤電路 鍵盤消息 Windows系統 Windows系統分發 8 2按鍵 鍵盤事件 用戶按下或釋放鍵盤上的按鍵鍵盤事件的表現形式是一個鍵盤掃描碼 鍵盤消息 Windows和鍵盤驅動程序將鍵盤掃描碼轉換為格式化的鍵盤消息 鍵盤消息分類 可以分為按鍵消息和字符消息兩類 字符消息鍵 對能產生可顯示字符的按鍵 Windows不僅給應用程序發送按鍵消息 而且還發送字符消息 WM CHAR 非字符消息鍵 shift鍵 功能鍵 光標方向鍵 特殊字符鍵 如Insert和Delete Windows只發送 產生 按鍵消息 8 2 2四個按鍵消息 桉下按鍵時 Windows把WM KEYDOWN或者WM SYSKEYDOWN消息放到具有輸入焦點的窗口的應用程序隊列里釋放按鍵時 Windows把WM KEYUP或者WM SYSKEYUP消息放到具有輸入焦點的窗口的應用程序隊列里 當桉下按鍵不放持續一段時間時 Windows會給窗口發送一系列的WM KEYDOWN或者WM SYSKEYDOWN消息 按鍵消息有四種形式 8 2 3系統按鍵消息與非系統按鍵消息 非系統按鍵消息 WM KEYDOWN和WM KEYUP系統按鍵消息 WM SYSKEYDOWN和WM SYSKEYUP系統按鍵 通常是 Alt 另一個鍵 的組合Alt Tab Alt F4 Alt Esc系統按鍵的作用是 打開程序的菜單或者系統菜單上的某選項 用于切換活動窗口等系統功能 應用程序一般對WM SYSKEYDOWN和WM SYSKEYUP消息忽略 不感興趣 即交給DefWindowProc 函數處理 8 2 4虛擬鍵碼 鍵盤消息發生時 MSG結構體中的wParam表示按下或釋放鍵得到的虛擬鍵碼 而lParam則包含了屬於按鍵的其他信息 虛擬鍵碼 是Windows設計者在WinUser h文件中用識別字定義的一種 鍵位碼 數字 字母的虛擬鍵碼用ASCII碼定義 其余都用識別字定義 附加鍵盤上的虛擬鍵碼是單獨定義的 鍵盤消息structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 按鍵消息名WPARAMwParam 虛擬鍵碼LPARAMlParam 消息參數DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 2 4虛擬鍵碼 鍵盤消息structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 按鍵消息名WPARAMwParam 虛擬鍵碼LPARAMlParam 消息參數DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 2 4虛擬鍵碼 鍵盤消息structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 按鍵消息名WPARAMwParam 虛擬鍵碼LPARAMlParam 消息參數DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 2 4虛擬鍵碼 鍵盤上的字母和數字鍵的虛擬鍵碼 鍵盤消息structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 按鍵消息名WPARAMwParam 虛擬鍵碼LPARAMlParam 消息參數DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 2 5按鍵消息的參數lParam 1 重復計數 16 bit 2 OEM掃描碼 8 bit 3 擴充鍵識別字 1 bit 4 環境代碼 1 bit 5 鍵的先前狀態 1 bit 6 轉換狀態 1 bit 圖8 1lParam變量中的6個按鍵欄目 鍵盤消息structMSG HWNDhwnd 接收消息的窗口代號 句柄 UINTmessage 按鍵消息名WPARAMwParam 虛擬鍵碼LPARAMlParam 消息參數DWORDtime 消息出現的時間POINTpt 鼠標在屏上的坐標 8 2 6使用GetKeyState函數了解按鍵的狀態 按鍵的狀態 是指某個鍵盤按鈕按下去沒有GetKeyState 函數 獲得某個鍵盤按鈕的按鍵的狀態 SHORTGetKeyState intnVirtKey nVrtKey 虛擬鍵碼若要求的虛擬鍵是字母或數字 A Z a z或0 9 nVirtKey必須被置為相應字符的ASCII碼值對于其他的鍵 nVirtKey必須是一虛擬鍵碼 返回值 給出了給定虛擬鍵的狀態最高二進制位為1 則鍵處于DOWN狀態最高二進制位為0 則鍵為UP狀態例子 intiState GetKeyState VK SHIFT if iState 0 MsgBox NULL Shift ShiftisDown MB OK 8 2 6使用GetKeyState 函數了解按鍵的狀態 經常應用 使用虛擬鍵碼常數VK SHIFT VK CONTROL和VK MENU作為nVirtKey參數的值 它給出shift ctrl或alt鍵的值而不區分左右鍵區分鍵的左 右鍵的情形 使用如下的虛擬鍵碼常數作nVirtKey的值VK LSHIFT VK RSHIFT 左 右Shift鍵VK LCONTROL VK RCONTROL 左 右Ctrl鍵VK LMENU VK RMENU 左 右Menu鍵請注意GetKeyState 的使用 只檢查正在處理的鍵盤信息發生時有關鍵的按鍵狀態 不能獲得和鍵盤消息無關的其它鍵的狀態 8 2 7按鍵消息及其使用 四個按鍵消息僅能表示系統鍵還是非系統鍵產生的 是桉下還是釋放產生的 要知道是哪個按鍵產生的消息 則必須要看消息參數wParam lParam WM SYSKEYDOWN和WM SYSKEYUP消息是由Windows系統使用的鍵盤消息 應用程序編程人員不必為此費心編程員只要處理WM KEYDOWN消息就行了 WM KEYUP消息通常也可以忽略 所以 Windows程序編程人員對不產生字符的按鍵通常使用WM KEYDOWN消息 switch message caseWM KEYDOWN break 8 2 7按鍵消息及其使用 上機習題 通過方向鍵控制方塊在窗口的客戶區內運動分析 1 變量定義 intx0 10 y0 10 最初的坐標值intx1 x2 y1 y2 intdx 50 dy 50 矩形的長 寬staticintrow 0 line 0 矩形目前所在的行列號2 功能分類 1 畫矩形caseWM PAINT hdc BeginPaint hwnd x1 y1 x2 y2 8 2 7按鍵消息及其使用 上機習題 通過方向鍵控制方塊在窗口的客戶區內運動分析 2 獲取鍵盤虛擬碼 caseWM KEYDOWN switch wParam caseVK DOWN line break caseVK UP line break caseVK LEFT row break caseVK RIGHT row break if line 20 line 20 if line40 row 40 InvalidateRect hwnd NULL 1 要求重畫矩形return0 break 8 2 8為SYSMETS加上鍵盤界面實現滾動條功能 利用SendMessage函數實現SYSMETS加上鍵盤界面實現滾動條功能 SendMessage hwnd message wParam lParam 本函數的功能是把message窗口消息及消息參數wParam lParam發送到hwnd所指向的窗口函數 在這里 就是把message發送給它自己這個窗口 8 3字符消息及其處理 桉下每一個按鍵要產生一個按鍵消息 但是 對虛擬鍵碼是字符的按鍵來說還要產生一個字符消息 那么字符消息是怎樣產生的呢 這工作由Windows系統為您完成 消息循環中的TranslateMessage函數以msg為參數TranslateMessage 函數作用是 如果此按鍵消息的虛擬鍵碼是字符按鍵的碼 它將產生一個字符消息 并把字符消息放入應用程序的消息隊列 由產生的字符消息把虛擬鍵碼轉換為字符的ASCII碼或UNICODE碼 用戶按字符鍵 按鍵消息WM KEYDOWN TranslateMessage 函數 字符消息WM CHAR 8 3 2四個字符消息 WM CHAR和WM DEADCHAR消息是從WM KEYDOWN按鍵消息得到的字符消息 WM SYSCHAR和WM SYSDEADCHAR消息是由WM SYSKEYDOWN系統按鍵消息得到的字符消息 字符消息的結構與按鍵消息的結構是一樣的lParam參數 與按鍵消息的lParam參數相同wParam參數 字符的ANSI或Unicode代碼 四個字符消息 8 3 3按鍵消息和字符消息的處理順序 消息循環中的GetMessage 從消息隊列中取到消息 首先得到的是WM KEYDOWN或WM SYSKEYDOWN消息 TranslateMessage 函數將WM KEYDOWN和WM SYSKEYDOWN消息中的虛擬鍵碼進行處理 如果WM KEYDOWN或WM SYSKEYDOWN消息是由字母數字按鍵產生的 則Windows隨之就要產生一個字符消息 此字符消息是夾在按鍵消息之間傳遞給窗口函數的 while GetMessage 將消息發送給窗口函數 8 3 3按鍵消息和字符消息的處理順序 例如 如果CapsLock未打開 而用戶按下再釋放A鍵 則窗口函數將接收到如表8 10所示的三個消息 8 3 3按鍵消息和字符消息的處理順序 例如 如果您先按下Shift鍵 再按下A鍵 然後釋放A鍵 再釋放Shift鍵 就會輸入大寫的A 而窗口函數會接收到五個消息 8 3 3按鍵消息和字符消息的處理順序 例如 如果用戶按住A鍵 以使自動重復產生一系列的按鍵消息 那么對每條WM KEYDOWN消息 都會得到一條字符消息 如表8 12所示 8 3 4控制字符鍵及其處理 什么是控制字符鍵Tab Enter Backspace Escape鍵稱為控制字符鍵 它們的虛擬鍵碼就是下表中相應的ASCII代碼 它們又稱為控制碼 控制碼還可以用兩個鍵組合產生 例如組合使用Ctrl鍵與字母鍵會產生從0 x01 Ctrl A 到0 x1A Ctrl Z 的ASCII控制代碼 其中某些控制代碼列出如表8 13所示 8 3 4控制字符鍵及其處理 2 控制字符鍵的處理 Tab Enter Backspace和Escape鍵在Windows中 這些控制字符的虛擬鍵碼就是ASII碼辦法是在處理WM CHAR消息分支中作處理 8 3 4控制字符鍵及其處理 控制字符的虛擬鍵碼就是ASII碼 在處理WM CHAR消息分支中作處理 caseWM CHAR 這是控制字符鍵產生的字符消息 其他程序碼switch wParam 根據wParam中的控制字符碼 ASCII 決定下面分支 case b backspace 其處理程序碼break case t tab制表符 其處理程序碼break case n linefeed 其處理程序碼break case r carriagereturn回車 其處理程序碼break default charactercodes其他字符碼 其處理程序碼break return0 8 3 4控制字符鍵及其處理 上機練習 具有簡單的行編輯功能的軟件1 定義變量staticcharkeychar 3 存放敲入的字符staticcharstr 201 記錄已經敲入過的所有字符intlen 有效字符的個數2 響應WM CHAR消息caseWM CHAR len strlen str if wParam b 8 3 4控制字符鍵及其處理 上機練習 具有簡單的行編輯功能的軟件3 顯示內容caseWM PAINT hdc BeginPaint hwnd 8 3 5WM DEADCHAR消息 WM DEADCHAR和WM SYSDEADCHAR消息稱為 死字符消息 Windows應用程序經常忽略WM DEADCHAR和WM SYSDEADCHAR消息 死字符消息 是怎樣產生的 它們的工作方式怎樣 在某些非U S 英語鍵盤上 有些鍵用於給字母加上音調 本身并不產生字符 這些鍵稱之

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論