Ⅰ 如何監聽windows虛擬鍵盤
在Microsoft Windows 中,鍵盤和滑鼠是兩個標準的用戶輸入源,在一些交疊的操作中通常相互補充使用。當然,滑鼠在今天的應用程序中比10年前使用得更為廣泛。甚至在一些應用程序中,我們更習慣於使用滑鼠,例如在游戲、畫圖程序、音樂程序,以及Web創覽器等程序中就是這樣。然而,我們可以不使用滑鼠,但絕對不能從一般的PC中拆掉鍵盤。 Windows程序獲得鍵盤輸入的方式:鍵盤輸入以消息的形式傳遞給程序的窗口過程。實際上,第一次學習消息時,鍵盤就是一個明顯的例子:消息應該傳遞給應用程序的信息類型。 Windows用8種不同的消息來傳遞不同的鍵盤事件。這好像太多了,但是(就像我們所看到的一樣)程序可以忽略其中至少一半的消息而不會有任何問題。並且,在大多數情況下,這些消息中包含的鍵盤信息會多於程序所需要的。處理鍵盤的部分工作就是識別出哪些消息是重要的,哪些是不重要的。 鍵盤基礎知識 雖然應用程序在很多情況下可以通過滑鼠實現信息的輸入,但到現在為止鍵盤仍然是PC機中不可替代的重要輸入設備。 用鍵盤當作輸入設備,每當用戶按下或釋放某一個鍵時,會產生一個中斷,該中斷激活鍵盤驅動程序KEYBOARD.DRV來對鍵盤中斷進行處理。 KEYBOARD.DRV程序會根據用戶的不同操作進行編碼,然後調用Windows用戶模塊USER.EXE生成鍵盤消息,並將該消息發送到消息隊列中等候處理。 1.掃描碼和虛擬碼 掃描碼對應著鍵盤上的不同鍵,每一個鍵被按下或釋放時,都會產生一個唯一的掃描碼作為本身的標識。掃描碼依賴於具體的硬體設備,即當相同的鍵被按下或釋放時,在不同的機器上可能產生不同的掃描碼。在程序中通常使用由Windows系統定義的與具體設備無關的虛擬碼。在擊鍵產生掃描碼的同時,鍵盤驅動程序KEYBOARD.DRV截取鍵的掃描碼,然後將其翻譯成對應的虛擬碼,再將掃描碼和虛擬碼一齊編碼形成鍵盤消息。所以,最後發送到消息隊列的鍵盤消息中,既包含了掃描碼又包含了虛擬碼。 經常使用的虛擬碼在WINDOWS.H文件中定義,常用虛擬碼的數值、常量符號和含義如表所示。 取值(16進制) 常量符號 含義 01 VK_LBUTTON 滑鼠左鍵 02 VK_RBUTTON 滑鼠右鍵 03 VK_CANCEL Break中斷鍵 04 VK_MBUTTON 滑鼠中鍵 05-07 -- 未定義 08 VK_BACK (BackSpace)鍵 09 VK_TAB Tab鍵 0A-0B -- 未定義 0C VK_CLEAR Clear鍵 0D VK_RETURN Enter鍵 0E-0F -- 未定義 10 VK_SHIFT Shift鍵 11 VK_CONTROL Ctrl鍵 12 VK_MENU Alt鍵 13 VK_PAUSE Pause鍵 14 VK_CAPTIAL CapsLock鍵 15-19 -- 漢字系統保留 1A -- 未定義 1B VK_ESCAPE Esc鍵 1C-1F -- 漢字系統保留 20 VK_SPACE 空格鍵 21 VK_PRIOR PageUp鍵 22 VK_NEXT PageDown鍵 23 VK_END End鍵 24 VK_HOME Home鍵 25 VK_LEFT ←(Left Arrow)鍵 26 VK_UP ↑(Up Arrow)鍵 27 VK_RIGHT →(Right Arrow)鍵 28 VK_DOWN ↓(Down Arrow)鍵 29 VK_SELECT Select鍵 2A -- OEM保留 2B VK_EXECUTE Execute鍵 2C VK_SNAPSHOT Print Screen鍵 2D VK_INSERT Insert鍵 2E VK_DELETE Delete鍵 2F VK_HELP Help鍵 30-39 VK_0-VK_9 數字鍵0-9 3A-40 -- 未定義 41-5A VK_A-VK_Z 字母鍵A-Z 5B-5F -- 未定義 60-69 VK_NUMPAD0-VK_NUMPAD9 小鍵盤數字鍵0-9 6A VK_MULTIPLY *(乘號)鍵 6B VK_ADD +(加號)鍵 6C VK_SEPAPATOR 分隔符鍵 6E VK_SUBTRACT -(減號)鍵 6F VK_DECIMAL .(小數點)鍵 70-87 VK_DIVIDE /(除號)鍵 88-8F VK_F1-VK_F24 F1-F24功能鍵 90 VK_NUMBERLOCK Number lock鍵 91 VK_SCROLL Scroll lock鍵 92-B9 -- 未定義 BA-C0 -- OEM保留 C1-DA -- 未定義 DB_E4 -- OEM保留 E5 -- 未定義 E6 -- OEM保留 E7-E8 -- 未定義 E9-F5 -- OEM保留 F6-FE -- 未定義 2.輸入焦點 同一時刻,Windows中可能有多個不同的程序在運行,也就是說有多個窗口同時存在。這時,鍵盤由多個窗口共享,但只有一個窗口能夠接收到鍵盤消息,這個能夠接收鍵盤消息的窗口被稱為擁有輸入焦點的窗口。 擁有輸入焦點的窗口應該是當前的活動窗口,或者是活動窗口的子窗口,其標題和邊框會以高亮度顯示,以區別於其他窗口。擁有輸入焦點的也可以是圖標而不是窗口,此時,Windows也將消息發送給圖標,只是消息的格式略有不同。 窗口過程可以通過發送WM_SETFOCUS和 WM_KILLFOCUS消息使窗體獲得或失去輸入焦點。程序也可以通過捕獲WM_SETFOCUS和WM_KILLFOCUS消息來判斷窗體何時獲得或失去輸入焦點。其中WM_SETFOCUS消息表示窗口正獲得輸入焦點,WM_ KILLFOCUS消息表示窗口正失去輸入焦點。 3.鍵盤消息 鍵盤消息分為系統鍵消息和非系統鍵消息。系統鍵消息是指由Aft鍵和其他鍵組合而產生的按鍵消息。當系統鍵被按下時產生WM_ SYSKEYDOWN消息,當系統鍵被釋放時產生WM_SYSKEYUP消息。 Aft鍵與其他鍵形成的組合鍵通常用於對程序菜單和系統菜單進行選擇,或用於在不同的程序之間進行切換。因此,系統鍵消息應該交由Windows進行處理,用戶所編制的程序一般不處理系統鍵消息,而是將這些消息交由DefWindowProc函數進行處理。如果用戶想對系統鍵消息進行處理,應該在處理完這些消息後,再將其發送給DefWindowProc函數,使得Windows系統能夠正常工作。 某些擊鍵消息可以被轉換成字元消息,例如字母鍵、數字鍵等。而有些鍵只能產生按鍵消息而沒有字元消息,例如 Shift鍵、Insert鍵等。消息循環中的 TranslateMessage函數可以實現從擊鍵消息向字元消息的轉化。當GetMessage函數捕獲一個WM_SYSKEYDOWN消息或 WM_KEYDOWN消息後,TranslateMessage函數判斷產生該消息的鍵是否能夠被轉換成字元消息,如果能,就將該消息轉換成字元消息,再通過DispatchMessape函數將轉換後的字元消息發送到消息隊列中去。字元消息共有以下四種,如表所示。 字元 系統字元 非系統字元 普通字元 WM_SYSCHAR WM_CHAR 死字元 WM_SYSDEADCHAR WM_DEADCHAR 其中死字元是由某些特殊鍵盤上的按鍵所造成的,Windows一般忽略死字元所產生的消息。 Windows的消息一般是通過一個MSG結構體變數傳送給消息處理函數的。對於鍵盤消息, MSG結構體變數的各個域中較重要的是lParam域和 wParam域。wParam域用於保存按鍵的虛擬鍵代碼或字元的ASCII碼。對於非字元消息,wParam域保存按鍵的虛擬健代碼;對於字元消息, wParam域不保存字元的ASCII碼。lParam域則用於保存擊鍵時產生的附加信息,實際上一個32位的lParam變數被分為六部分,記錄了以下相關信息:重復次數、OEM掃描碼、擴展鍵標志、關聯鍵標志、前一擊鍵狀態和轉換狀態。lParam域各位的含義如表所示。 位數 含義 0-15 擊鍵重復次數累加 16-23 OEM掃描碼 24 是否為擴展鍵 25-28 未定義 29 是否便用關聯鍵,及Alt鍵是否同時按下。 30 前一次擊鍵狀態,0表示該鍵前一次狀態為抬起,1表示前一次狀態為按下 31 轉換狀態 按鍵的次序不同,產生的消息也不相同。例如,按下並釋放1鍵,讀過程依次產生如表所示三條消息。按下1鍵所產生的消息和wParam的取值 消息 wParam變數取值 WM_KEYDOWN 虛擬碼1 WM_CHAR ASCII碼「1」 WM_KEYUP 虛擬碼1 如果按下Shift鍵後再按下1鍵並釋放,則依次產生如表所示的消息。按下 Shift鍵後按 1健所產生的消息和 wParam的取值 消息 wParam變數取值 WM_KEYDOWN 虛擬碼 VK_SHIFT WM_KEYDOWN 虛擬碼 VK_1 WM_CHAR ASCII碼「1」 WM_KEYUP 虛擬碼 VK_1 WM_KEYUP 虛擬碼 VK_SHIF 鍵盤應用實例 下面通過一個應用程序實例來說明在實際編程中如何處理鍵盤消息。 #include <windows.h> #include <stdio.h> // 全局變數 RECT rc; //記錄滾屏的矩形區域 ? int xChar, yChar; //文本輸入點坐標 WNDCLASSEX wnd; //窗口類結構變數 char szAppName[] = "鍵盤消息監視程序"; //窗口類名 //函數聲明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE hInstance,int iCmdShow); //函數:WinMain //作用:入口函數 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow) { MSG msg; if(!MyRegisterClass(hInstance)) { return FALSE; } if(!InitInstance(hInstance,iCmdShow)) { return FALSE; } while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } //函數:ShowKey //作用:實現在窗口中顯示按鍵信息 void ShowKey (HWND hwnd, int iType,char *szMessage,WPARAM wParam,LPARAM lParam) { static char *szFormat[2] ={"%-14s %3d %c %6u %4d %5s %5s %6s %6s", "%-14s %3d %c %6u %4d %5s %5s %6s %6s" }; char szBuffer[80]; HDC hdc; ScrollWindowEx(hwnd, 0, -yChar, &rc,&rc,NULL,NULL,SW_INVALIDATE); hdc = GetDC (hwnd); SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); TextOut (hdc, xChar, rc.bottom - yChar, szBuffer, wsprintf szBuffer, szFormat[iType], szMessage, //消息 wParam, //虛擬鍵代碼 (BYTE) (iType ? wParam :『 』),//顯示字元值 LOWORD (lParam), // 重復次數 HIWORD (lParam) & 0xFF, // OEM鍵盤掃描碼 //判斷是否為增強鍵盤的擴展鍵 (PSTR) (0x01000000 & lParam ? 「是」 : 「否」), //判斷是否同時使用了ALT鍵 (PSTR) (0x20000000 & lParam ? 「是」 : 「否」), (PSTR) (0x40000000 & lParam ? 「按下」 : 「抬」), //判斷前一次擊鍵狀 (PSTR)(0x80000000 & lParam ? 「按下」 : 「抬起」)) //判斷轉換狀態? ); ReleaseDC (hwnd, hdc); ? ValidateRect (hwnd, NULL); ? } //函數:WndProc //作用:處理主窗口的消息 LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static char szTop[] ="消息鍵 字元 重復數 掃描碼 擴展碼 ALT 前一狀態 轉換狀態"; static char szUnd[] ="_______ __ ____ _____ ______ ______ ___ _______ ______"; //在窗口中輸出文字作為信息標題 HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; switch (iMsg) { case WM_CREATE://處理窗口創建的消息 hdc = GetDC (hwnd); //設定字體 SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); //檢取當前字體的度量數據 GetTextMetrics (hdc, &tm); xChar = tm.tmAveCharWidth;//保存字體平均寬度 yChar = tm.tmHeight; //保存字體高度 ReleaseDC (hwnd, hdc); rc.top = 3 * yChar / 2; return 0; case WM_SIZE://處理窗口大小改變的消息 //窗體改變後保存新的滾屏區域右下角坐標 rc.right = LOWORD (lParam); rc.bottom = HIWORD (lParam); UpdateWindow (hwnd); return 0; case WM_PAINT: //處理窗口重繪消息 InvalidateRect (hwnd, NULL, TRUE); hdc = BeginPaint (hwnd, &ps); SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; SetBkMode (hdc, TRANSPARENT) ; TextOut (hdc, xChar, yChar / 2, szTop, (sizeof szTop) - 1) ; TextOut (hdc, xChar, yChar / 2, szUnd, (sizeof szUnd) - 1) ; EndPaint (hwnd, &ps); return 0; case WM_KEYDOWN: //處理鍵盤上某一鍵按下的消息 ShowKey (hwnd, 0, "WM_KEYDOWN",wParam, lParam); return 0; case WM_KEYUP: //處理鍵盤上某一按下鍵被釋放的消息 ShowKey (hwnd, 0, "WM_KEYUP", wParam, lParam); return 0; case WM_CHAR: //處理擊鍵過程中產生的非系統鍵的可見字元消息 howKey (hwnd, 1, "WM_CHAR", wParam, lParam); return 0; case WM_DEADCHAR: //處理擊鍵過程中產生的非系統鍵"死字元"消息 ShowKey (hwnd, 1, "WM_DEADCHAR", wParam, lParam); return 0; case WM_SYSKEYDOWN: //處理系統鍵按下的消息 ShowKey (hwnd, 0, "WM_SYSKEYDOWN",wParam, lParam); break; case WM_SYSKEYUP: //處理系統鍵抬起的消息 ShowKey (hwnd, 0, "WM_SYSKEYUP", wParam, lParam); break; case WM_SYSCHAR://處理系統鍵可見字元消息 ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam); break; case WM_SYSDEADCHAR://處理系統鍵"死字元"消息 ShowKey (hwnd, 1, "WM_SYSDEADCHAR", wParam, lParam); break; case WM_DESTROY: //處理結束應用程序的消息 PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam); } //函數:MyRegisterClass //作用:注冊窗口類 BOOL MyRegisterClass(HINSTANCE hInstance) { wnd.cbSize= sizeof (wnd); wnd.style = CS_HREDRAW CS_VREDRAW; wnd.lpfnWndProc = WndProc; wnd.cbClsExtra = 0; wnd.cbWndExtra = 0; wnd.hInstance = hInstance; wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);? wnd.hCursor = LoadCursor (NULL, IDC_ARROW); wnd.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wnd.lpszMenuName = NULL; wnd.lpszClassName = szAppName; wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION); return RegisterClassEx (&wnd); } //函數:InitInstance //作用:創建主窗口 BOOL InitInstance(HINSTANCE hInstance,int iCmdShow) { HWND hwnd; hwnd = CreateWindow (szAppName, "鍵盤消息監視程序", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL ); if(!hwnd) { return FALSE; } ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); return TRUE; }
Ⅱ 設備識別,關於掃描碼,虛擬鍵碼,鍵盤ASCII碼區別於聯系的理解
掃描碼 是鍵盤對應按鍵的編碼 ,虛擬鍵碼 是操作系統對 對應按鍵的編碼鍵盤ASCII碼 是操作系統對對應 虛擬鍵碼的編碼(ASCII編碼) 當用戶按下某個鍵時, 1.鍵盤會檢測到這個動作,並通過 鍵盤控制器 把 掃描碼(scan code) 傳送到計算機; 鍵盤掃描碼跟具體的硬體有關的,不同廠商對同一個鍵的掃描碼有可能不同。 2.計算機接收到 掃描碼 後,將其交給 鍵盤 驅動程序 ; 3. 鍵盤驅動程序 把這個 掃描碼 轉換為 鍵盤虛擬碼 ; 虛擬碼與具體硬體無關,不同廠商的鍵盤,同一個鍵 的 虛擬碼 總是相同的。 4.然後,鍵盤驅動程序 把該鍵盤操作的 掃描碼 和 虛擬碼 以及 其它信息 傳遞給 操作系統; 5.操作 系統將獲得 的信息封裝在一個 鍵盤消息 中,並把該 鍵盤消息 插入到 消息列隊。 5.通過Windows的 消息系統,該 鍵盤消息 被送到 某個窗口 中; 6.窗口所在的應用程序 接收到消息後,可以了解到有關 鍵盤操作的信息,然後決定作出一定的響應
Ⅲ 請教如何得到按鍵的硬體掃描碼 100publicsub
掃描碼 是鍵盤對應按鍵的編碼 ,虛擬鍵碼 是操作系統對 對應按鍵的編碼鍵盤ASCII碼 是操作系統對對應 虛擬鍵碼的編碼(ASCII編碼)
當用戶按下某個鍵時, 1.鍵盤會檢測到這個動作,並通過 鍵盤控制器 把 掃描碼(scan code) 傳送到計算機;
鍵盤掃描碼跟具體的硬體有關的,不同廠商對同一個鍵的掃描碼有可能不同。
2.計算機接收到 掃描碼 後,將其交給 鍵盤 驅動程序 ;
3. 鍵盤驅動程序 把這個 掃描碼 轉換為 鍵盤虛擬碼 ;
虛擬碼與具體硬體無關,不同廠商的鍵盤,同一個鍵 的 虛擬碼 總是相同的。
4.然後,鍵盤驅動程序 把該鍵盤操作的 掃描碼 和 虛擬碼 以及 其它信息 傳遞給 操作系統;
5.操作 系統將獲得 的信息封裝在一個 鍵盤消息 中,並把該 鍵盤消息 插入到 消息列隊。
5.通過Windows的 消息系統,該 鍵盤消息 被送到 某個窗口 中;
6.窗口所在的應用程序 接收到消息後,可以了解到有關 鍵盤操作的信息,然後決定作出一定的響應
Ⅳ 虛擬QWERTY鍵盤 和 虛擬鍵盤 有什麼區別htc g14 屬於哪種
手機虛擬鍵盤是指用於全觸摸手機的虛擬於屏幕的按鍵虛擬鍵盤。可直接把觸摸屏上的虛擬鍵盤當實質鍵盤使用。
手機虛擬鍵盤為一種以CCITT的標准鍵,結合多個功能鍵組成實際鍵盤及鍵值表,產生虛擬鍵盤,以改善數據鍵入的方法,至少包含以下步驟:依據預設的鍵盤狀態值顯示對應的虛擬鍵;判斷是否有實際鍵被按下,若被按下鍵為CCITT標准鍵其中之一時,查詢鍵值表以得到鍵值;然後以預設的鍵盤狀態值及鍵值,查詢鍵值表以得到虛擬鍵值;若虛擬鍵值為虛擬鍵盤切換鍵則依據虛擬鍵盤切換鍵的鍵值改變鍵盤狀態值並呼叫鍵盤顯示模組以顯示對應的虛擬鍵盤,並且去除鍵值;否則,呼叫鍵盤顯示模組以顯示該虛擬鍵值。
QWERTY鍵盤,也稱全鍵盤,即第一行開頭6個字母是Q、W、E、R、T、Y的鍵盤布局,也就是現在普遍使用的電腦鍵盤布局。
「QWERTY」是主鍵盤字母區左上角6個字母的連寫 我們現在使用的鍵盤都稱為QWERTY柯蒂鍵盤。 最初,打字機的鍵盤是按照字母順序排列的,但如果打字速度過快,某些鍵的組合很容易出現卡鍵問題,於是克里斯托夫.拉森.授斯(Christopher Latham Sholes)發明了QWERTY鍵盤布局,他將最常用的幾個字母安置在相反方向,「在不至卡住的前提下盡量提高打字速度」。授斯在1868年申請專利,1873年使用此布局的第一台商用打字機成功投放市場。這就是為什麼有今天鍵盤的排列方式。 鍵盤的鍵位設計 一款鍵盤的鍵位設計包含了兩個概念,一是主體的英文和數字鍵位設計,二是各種附屬鍵位設計。 最通常的英文與數字鍵位設計方案就是俗稱的「QWERTY」柯蒂鍵盤。這是Christopher Latham Sholes於1868年發明的鍵位方案。 眾所周知,柯蒂鍵盤主要的設計目的就是使擊鍵的速度不至太快。不過在很多文章中的說法有一個小小的錯誤,這就是——柯蒂鍵盤的鍵位設計並不是要「使擊鍵的速度不至太快導致卡住」,而是「在不至卡住的前提下盡量提高打字速度」。 這兩種說法中有一個微妙的差異,這就是說,減慢打字速度不是最終目的,QWERTY鍵盤並不是在一味的減低速度,它固然有把ED這樣的常見組合放在一個手指上的減低速度設計,但也有很多諸如ER這樣的加速組合鍵位。 實際上這樣設計的根本原因在於機械式打字機的結構,其鉛字杠桿的結構決定了當兩個位置接近的鉛字同時按下的時候就會卡死,但相對的兩個相距較遠的鉛字就不會發生同樣的問題,相信有過英文打字機使用經驗的人應該都會有所體會。 在柯蒂鍵盤上,一些常用的字母被放在無名指、小拇指等位置上,這一向被認為是用小拇指等的不靈活性來減低速度,但這種說法沒有考慮到機械式打字機的實際情況,食指固然是最靈活的,但食指鍵位上的按鍵也是最容易卡死的,所以將常用字母放在邊緣以保證在高速打字時不會卡死也就是理所當然的。 所以說,設計柯蒂鍵盤的最終目的並不是為了單純的減低打字速度,事實上,柯蒂鍵盤的設計方案恰恰是為了提高打字速度,只不過是「在不會卡死的情況下盡力提高打字速度」。
QWERTY鍵盤,也稱全鍵盤。即第一行開頭6個字母是Q、W、E、R、T、Y的鍵盤布局,也就是現在普遍使用的電腦鍵盤布局。 QWERTY鍵盤是為了降低打字速度 最初,打字機的鍵盤是按照字母順序排列的,但如果打字速度過快,某些鍵的組合很容易出現卡鍵問題,於是克里斯托夫·拉森·授斯(Christopher Latham Sholes)發明了QWERTY鍵盤布局,他將最常用的幾個字母安置在相反方向,最大限度放慢敲鍵速度以避免卡鍵。授斯在1868年申請專利,1873年使用此布局的第一台商用 打字機成功投放市場。這就是為什麼有今天鍵盤的排列方式。 QWERTY鍵盤-鍵盤排列方式 但具有諷刺意味的是,這種129年前形成的、以放慢敲鍵速度為目的的鍵盤排列方式卻延續至今。1986年布魯斯·伯里文爵士曾在《奇妙的書寫機器》一文中表示:「QWERTY的安排方式非常沒效率。」,比如:大多數打字員慣用右手,但使用QWERTY,左手卻負擔了57%的工作。兩小指及左無名指是最沒力氣的指頭,卻頻頻要使用它們。排在中列的字母,其使用率僅占整個打字工作的30%左右,因此,為了打一個字,時常要上上下下移動指頭。 QWERTY鍵盤-還有下面的說法 電腦鍵盤是從英文打字機鍵盤演變而來的,當它最早出現在電腦上的時候,是以一種叫做「電傳打字機」的部件的形象出現的。 QWERTY鍵盤-紙帶打字機和卡片打字機 實際上,比電傳打字機更早的年代,鍵盤就已經出現在電腦附屬設備上了,在電腦還是能夠占滿一個大廳的年代裡,主要的電腦輸入設備就是穿孔紙帶和穿孔卡片,這些紙帶和卡片當然不可能是人手一點點穿出來的,它們是使用專用的「紙帶穿孔機」和「卡片穿孔機」來穿出的,而在這兩種機器上也都有一台很像普通打字機的電動打字機作為輸入設備。只不過相對而言,這兩種設備都不是電腦的一部分,這點是和電傳打字機不同的,所以我們不把它們作為電腦鍵盤發展史的一部分。 「電傳打字機」是在鍵盤+顯示器的輸入輸出設備出現以前電腦主要的互動式輸入輸出設備,你可以把它想像成一個上蓋帶有鍵盤的列印機,用戶所打的字和電腦輸出的結果都會在鍵盤前方的列印輸出口上列印出來。 「電傳打字機」是大型計算機(MAINCOMPUTER)和小型計算機(SMALLCOMPUTER)時代最主要的電腦互動式輸入輸出設備。70年代中期以後,隨著顯示器設計的成熟,電傳打字機就逐漸退出了電腦的世界,而鍵盤則從從擺脫出來成為了獨立的一種設備。 「電傳打字機」的鍵盤沒有今天電腦鍵盤那麼按鍵和那麼多功能,實際上它幾乎和全尺寸的打字機鍵盤是一樣的,電木塑料下面是機械的按鍵結構,這種設計也為初期的電腦鍵盤所繼承。 在這個時期,由於個人電腦的體積還很小,所以流行的設計是將鍵盤直接作在主機上,著名的APPLEII系列電腦就是這樣的結構。但隨著IBMPC開始將當時還很龐大的硬碟引入到個人電腦上,在80年代中期,獨立的鍵盤成為主流的設計。 早期的鍵盤幾乎都是機械式鍵盤,准確的說是機械觸點式鍵盤,這種鍵盤使用電觸點接觸作為連同標志,使用機械金屬彈簧作為彈力機構。這種鍵盤的手感硬、按鍵行程長、按鍵阻力變化快捷清脆,手感很接近打字機鍵盤,所以在當時很受歡迎,直到今天仍然有相當一部分人十分懷念這種鍵盤的手感。 但是,機械觸點式鍵盤最大的兩個缺點是機械彈簧很容易損壞,而且電觸點會在長時間使用後氧化,導致按鍵失靈。所以在90年代以後,機械觸點式鍵盤就逐漸退出了歷史舞台。 一開始,取而代之的是電磁機械式鍵盤。電磁機械式鍵盤仍然是一種機械式鍵盤,但它與機械觸點式鍵盤不同的是,它並非依靠機械力將兩個電觸點連通,而是將電觸點封閉在一個微型電位器里,在按鍵下部則放置一個磁鐵,通過磁力來接通電流。 與機械觸點式鍵盤相比,電磁機械式鍵盤的使用壽命強了很多,但是仍然沒能解決機械式鍵盤所固有的機械運動部分容易損壞的問題,所以電磁機械式鍵盤沒能在市場上生存多久,很快就被80年代後期出現的非接觸式鍵盤取代了。 所以非接觸式鍵盤,是與此前的各種「接觸式鍵盤」相對而言的,與「接觸式鍵盤」不同的是,它們並不是依靠導電觸點的機械式連通來獲得按鍵信號的,而是依靠按鍵本身的電參數變化來獲得按鍵信號。由於不需要觸點的機械接觸,所以它的使用壽命就能強很多。 主要的非接觸式鍵盤有電阻式鍵盤和電容式鍵盤。其中電容式鍵盤由於工藝更加簡單成本更低所以更受到普遍應用。與機械式鍵盤相比,它最大的兩個特點是使用彈性橡膠製作的彈簧取代了機械金屬彈簧,同時由機械鍵盤的電連通轉為通過按鍵底部和鍵盤底部的兩個電容極板距離的變化帶來的電容量變化來獲得按鍵的信號。 與機械式鍵盤相比,電容式鍵盤的手感有了很大的變化,變得輕柔而富於韌性,這種手感一直延續到今天,成為目前鍵盤的主流設計手感,這也就是為什麼很多文章說現在的鍵盤都是電容式鍵盤的原因,但其實這種手感並不來自電容式的結構而來自橡膠彈簧對機械金屬彈簧的取代,這不是電容式鍵盤之所以為電容式鍵盤的原因。 電容式鍵盤由於其原理,所以每一個按鍵都必須做成獨立的封閉結構,這樣的鍵盤也被分類為「封閉式鍵盤」。 對於大多數鍵盤文章,講到電容式鍵盤也就告一段落了,但是其實他們的錯誤也正在於此,為什麼?這里先賣一個關子,當我們講到鍵盤的結構時再繼續。 QWERTY鍵盤-鍵盤的鍵位設計 一款鍵盤的鍵位設計包含了兩個概念,一是主體的英文和數字鍵位設計,二是各種附屬鍵位設計。最通常的英文與數字鍵位設計方案就是俗稱的「QWERTY」柯蒂鍵盤。這是ChristopherLathamSholes於1868年發明的鍵位方案。 總所周知,柯蒂鍵盤主要的設計目的就是使擊鍵的速度不至太快。不過在很多文章中的說法有一個小小的錯誤,這就是——柯蒂鍵盤的鍵位設計並不是要「使擊鍵的速度不至太快導致卡住」,而是「在不至卡住的前提下盡量提高打字速度」。 這兩種說法中有一個微妙的差異,這就是說,減慢打字速度不是最終目的,QWERTY鍵盤並不是在一味的減低速度,它固然有把ED這樣的常見組合放在一個手指上的減低速度設計,但也有很多諸如ER這樣的加速組合鍵位。 實際上這樣設計的根本原因在於機械式打字機的結構,其鉛字杠桿的結構決定了當兩個位置接近的鉛字同時按下的時候就會卡死,但相對的兩個相距較遠的鉛字就不會發生同樣的問題,相信有過英文打字機使用經驗的人應該都會有所體會。 在柯蒂鍵盤上,一些常用的字母被放在無名指、小拇指等位置上,這一向被認為是用小拇指等的不靈活性來減低速度,但這種說法沒有考慮到機械式打字機的實際情況,食指固然是最靈活的,但食指鍵位上的按鍵也是最容易卡死的,所以將常用字母放在邊緣以保證在高速打字時不會卡死也就是理所當然的。 所以說,設計柯蒂鍵盤的最終目的並不是為了單純的減低打字速度,事實上,柯蒂鍵盤的設計方案恰恰是為了提高打字速度,只不過是「在不會卡死的情況下盡力提高打字速度」。 進入20世紀以後,機電打字機發明使得機械式打字機的鉛字臂卡死不再成為一個重要的問題,眾多的高速打字鍵盤也就應運而生。其中最著名的也就是DVORAK德沃拉克鍵盤。 德沃拉克鍵盤是AugustDvorak教授在1930年設計的鍵位方案,由於不再考慮按鍵的機械結構問題,所以按鍵排布完全按照理想化的擊鍵率分布設計。手指運動的行程比柯蒂鍵盤要小得多,平均打字速度幾乎提高了一倍。不過正如很多事情一樣,習慣的力量是難以抵擋的,德沃拉克鍵盤至今只是在極少數專業場合使用。不過對於想試試的人來說,可以嘗試一下Windows里自帶的德沃拉克鍵盤方案。 QWERTY鍵盤-非英文鍵盤方案 各種語言的鍵盤基本都是在英文鍵盤的基礎上改變而成的,大部分鍵的排列方式都和英文鍵盤相差不遠,只有一些細微的差別,例如英國鍵盤上的美元符號變成了英鎊符號,而德文鍵盤上的子母Y和Z互換了位置。各種遠東語言鍵盤在英文按鍵部分則與不標準的美式英文鍵盤沒有什麼大的不同,但在一些附屬按鍵上則有明顯的區別。對於中國用戶來說,最容易見到的非美語言鍵盤可能就是二手市場上常見的日文鍵盤了,與標準的英文鍵盤相比,它的大部分按鍵都是一樣的,但在一些標點符號上卻有明顯的位置差異,從而導致在英文系統中使用一些標點的時候出現按鍵的標識和實際內容對應不上的情況。 鍵位設計的另一個概念就是附屬鍵位的設計,從最早的IBMPC83鍵盤到現在主流的108鍵Windows98鍵盤,已經更新了幾代,但總體上並沒有根本性的變化。雖然其中有一些諸如緊湊型的設計,但從市場反應來看是不成功的。由此可見,目前的鍵盤鍵位設計經過了多年的實踐檢驗,已經是非常成熟的理想設計。 弄巧成拙的十字方向鍵設計 所謂的十字形方向鍵,指的就是鍵盤上的獨立方向鍵呈十字形排列,這種設計最初是為了在形象上更為接近傳統的83鍵盤設計,但實際的效果卻相當的差。 最早的十字形鍵是微軟第一代人體工學鍵盤上使用的,但隨後就成為這一代名品上被人罵得最多的設計,十字形的鍵位看起來很好看,但實際使用一下就會發現這種按鍵設計手指會別扭的擠在一起,無論在日常使用還是在游戲中都極不方便,特別是在賽車游戲中幾乎沒法玩下去。所以微軟在此後的第二代產品中又改回了原來的設計。 不過可笑的是,始作俑者微軟自己都已經不用十字形方向鍵了,但近來一些國內的廠商卻又把這種弄巧成拙的設計拾了回來,還作為特色設計之一來大肆宣傳。強烈建議大家對此不要考慮,否則買回來就有夠受的。 QWERTY鍵盤的結構 前面,我們提到了,現在的鍵盤其實並不是真正的電容鍵盤,那麼現在的鍵盤屬於哪一類呢?還是讓我們拆開一個鍵盤來看一看。 從照片上我們可以看到一個普通的超薄型鍵盤,拆開後背的螺絲以後,可以將鍵盤拆成如圖的幾個部件。首先是鍵盤和上蓋板和嵌在其中的每個按鍵的鍵帽,這是用戶所主要接觸的部分。 在上蓋板以下,是一塊橡膠薄膜,在每個按鍵的位置上有一個彈性鍵帽,這個部件就是鍵盤的主要彈性元件,一款鍵盤的手感主要就是由這個部件的性狀和材質決定的,因此其形狀設計和橡膠成分都是各大鍵盤廠商的機密。需要指出的是,並不是所有的廠商都使用這樣的一體式橡膠薄膜,某些廠商如明基在某些鍵盤上習慣於每個按鍵都使用單獨的橡膠彈簧,這樣的設計更有利於保持每個按鍵手感的統一,但生產工序更為復雜一些。 在橡膠薄膜以下,是三層重疊在一起的塑料薄膜,上下兩層覆蓋著薄膜導線,在每個按鍵的位置上有兩個觸點,而中間一張塑料薄膜則是不含任何導線的,將上下兩層導電薄膜分割絕緣開來,而在按鍵觸點的位置上則開有圓孔。 這樣,在正常情況下,上下兩層導電薄膜被中間層分隔開來,不會導通。但在上層薄膜受壓以後,就會在開孔的部位與下層薄膜連同,從而產生一個按鍵信號。 由此可見,現在的鍵盤實際上是一種接觸式鍵盤,盡管外形大相徑庭,但實際上它的基本原理和機械觸點式鍵盤是一樣的,依靠機械性的導電觸點連同來產生按鍵信號。根本不是電容式鍵盤。 實際上這種鍵盤的真正名字叫做「薄膜接觸式鍵盤」,是一種機械接觸式鍵盤。它和機械觸點式鍵盤一樣,有壽命短易損壞的問題,但是由於橡膠彈簧取代了金屬彈簧,所以它的手感比機械觸點式鍵盤要好而接近於電容式鍵盤,而且壽命雖不及電容式鍵盤,但比機械觸點式鍵盤要長得多。 真正的電容式鍵盤依據的是非接觸式的電容導電觸發原理,所以電路結構比薄膜接觸式鍵盤要復雜得多,而且電容式鍵盤的每個鍵都使用的是封閉式結構,其整體成本要遠遠高於開放式的薄膜接觸式鍵盤。所以現在除了少數高檔特種鍵盤以外,其實已經沒有真正的電容式鍵盤在賣了。 目前的主流鍵盤除了薄膜接觸式鍵盤以外,還有另外一種「導電橡膠接觸式鍵盤」,它的特點是只有一層導電薄膜,在每個按鍵位置上有不連通的兩個觸點,而橡膠彈簧的下部則使用導電橡膠來製作,當按下的時候就會將兩個觸點連通。 可以看出來,這種鍵盤的原理和計算器按鍵的原理是很接近的。實際上早在個人電腦的早期,這種設計就經常在一些超薄的膝上型電腦上使用。只是與薄膜接觸式鍵盤相比,這種結構的壽命更短,所以現在除了在某些特殊用途以外,已經在逐漸消失中。 在鍵盤的右上角,有一塊與薄膜連同的電路板,這塊電路板就是鍵盤的核心部分,從導電薄膜傳來的導通信號會通過導線輸入到電路板上的運算晶元,這塊晶元會根據上下兩條表面的導線編號通過晶元內部的一張按鍵排布表查找出對應按鍵的ASCII碼,通過介面將其輸出。 這種通過查表獲得按鍵編碼的方式稱之為「非編碼式鍵盤」,相對的有「編碼式鍵盤」,這種鍵盤的ASCII碼是直接由每個按鍵的數字電路產生的。與非編碼式鍵盤相比,編碼式鍵盤的成本高,重定義困難,所以現在已經很罕見了。電容式鍵盤由於其工作原理,大都是編碼式鍵盤,這也從另一個角度證明了現在的主流鍵盤並不是電容式鍵盤。 QWERTY鍵盤-ASCII碼 ASCII碼,即「美國國家標准資訊交換碼」()的縮寫。對於學過編程的朋友相信並不陌生,而對於沒有學過編程的朋友,可能就有介紹一番的需要。 ASCII碼是由ANSIX.3.4和ISO646兩種早期的編碼規格整合而來,在1970年由美國國家標准化委員會通過的編碼規格,它規定了128個基礎英文字元的二進制編碼規則,如大寫字母「A」的編碼就是65,而空格的編碼則為32。ASCII推出後逐漸取代了其他舊的編碼成為電腦編碼的統一標准,並被國際標准化組織ISO在80年代確認為國際標准。 由於ASCII只規定了128個最常用的英文字元,所以隨著電腦字元集的增長,逐漸出現了很多種在ASCII上擴充的編碼方式,我們熟悉的Unicode編碼就是其中較為復雜的一種,這是在標準的ASCIINO.5和ISO10646基礎上開發的32bits編碼方案。ISO10646是在ISO08859-1基礎上開發的編碼方案(ISO08859-1是在ASCII標准版ASCIINO.5上開發的256字元的標准擴展ASCII編碼),包含了目前所有的電腦字元在內,但由於過於龐大,所以在此基礎上發展了16bits的Unicode,其復雜度比ISO10646小了很多,但不包含一些非常罕見的的字元在內.
Ⅳ X或x鍵的虛鍵碼是多少
所謂的虛鍵碼就是ascii碼。
其中X的ascii碼為:88;x的ascii碼為120。
附:ascii碼表
ascii碼簡介:
ascii(American Standard Code for Information Interchange,美國標准信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,並等同於國際標准ISO/IEC 646。
請注意,ascii是American Standard Code for Information Interchange縮寫,而不是ASC2,有很多人在這個地方產生誤解。
Ⅵ virtual-key codes用的是什麼編碼
Virtual-Key_CodesJ是虛擬鍵碼。
適用於: 桌面應用程序 下表顯示了符號常量的名稱, 十六進制值, 滑鼠或鍵盤等值的系統所使用的虛擬鍵碼。 按數字順序列出的代碼。
Ⅶ 虛擬鍵盤按鍵的代碼是什麼
set WshShell = WScript.CreateObject("WScript.Shell") WshShell.SendKeys ("^a") 其中^ 是Ctrl鍵s
Ⅷ 如何模擬鍵盤輸入的所有應用程序
1.在Microsoft Windows 中,鍵盤和滑鼠是兩個標準的用戶輸入源,在一些交疊的操作中通常相互補充使用。當然,滑鼠在今天的應用程序中比10年前使用得更為廣泛。甚至在一些應用程序中,我們更習慣於使用滑鼠,例如在游戲、畫圖程序、音樂程序,以及Web創覽器等程序中就是這樣。然而,我們可以不使用滑鼠,但絕對不能從一般的PC中拆掉鍵盤。
Windows程序獲得鍵盤輸入的方式:鍵盤輸入以消息的形式傳遞給程序的窗口過程。實際上,第一次學習消息時,鍵盤就是一個明顯的例子:消息應該傳遞給應用程序的信息類型。
Windows用8種不同的消息來傳遞不同的鍵盤事件。這好像太多了,但是(就像我們所看到的一樣)程序可以忽略其中至少一半的消息而不會有任何問題。並且,在大多數情況下,這些消息中包含的鍵盤信息會多於程序所需要的。處理鍵盤的部分工作就是識別出哪些消息是重要的,哪些是不重要的。
2.鍵盤基礎知識
雖然應用程序在很多情況下可以通過滑鼠實現信息的輸入,但到現在為止鍵盤仍然是PC機中不可替代的重要輸入設備。
用鍵盤當作輸入設備,每當用戶按下或釋放某一個鍵時,會產生一個中斷,該中斷激活鍵盤驅動程序KEYBOARD.DRV來對鍵盤中斷進行處理。 KEYBOARD.DRV程序會根據用戶的不同操作進行編碼,然後調用Windows用戶模塊USER.EXE生成鍵盤消息,並將該消息發送到消息隊列中等候處理。
1.掃描碼和虛擬碼
掃描碼對應著鍵盤上的不同鍵,每一個鍵被按下或釋放時,都會產生一個唯一的掃描碼作為本身的標識。掃描碼依賴於具體的硬體設備,即當相同的鍵被按下或釋放時,在不同的機器上可能產生不同的掃描碼。在程序中通常使用由Windows系統定義的與具體設備無關的虛擬碼。在擊鍵產生掃描碼的同時,鍵盤驅動程序KEYBOARD.DRV截取鍵的掃描碼,然後將其翻譯成對應的虛擬碼,再將掃描碼和虛擬碼一齊編碼形成鍵盤消息。所以,最後發送到消息隊列的鍵盤消息中,既包含了掃描碼又包含了虛擬碼。
經常使用的虛擬碼在WINDOWS.H文件中定義,常用虛擬碼的數值、常量符號和含義如表所示。
取值(16進制) 常量符號 含義
01 VK_LBUTTON 滑鼠左鍵
02 VK_RBUTTON 滑鼠右鍵
03 VK_CANCEL Break中斷鍵
04 VK_MBUTTON 滑鼠中鍵
05-07 -- 未定義
08 VK_BACK (BackSpace)鍵
09 VK_TAB Tab鍵
0A-0B -- 未定義
0C VK_CLEAR Clear鍵
0D VK_RETURN Enter鍵
0E-0F -- 未定義
10 VK_SHIFT Shift鍵
11 VK_CONTROL Ctrl鍵
12 VK_MENU Alt鍵
13 VK_PAUSE Pause鍵
14 VK_CAPTIAL CapsLock鍵
15-19 -- 漢字系統保留
1A -- 未定義
1B VK_ESCAPE Esc鍵
1C-1F -- 漢字系統保留
20 VK_SPACE 空格鍵
21 VK_PRIOR PageUp鍵
22 VK_NEXT PageDown鍵
23 VK_END End鍵
24 VK_HOME Home鍵
25 VK_LEFT ←(Left Arrow)鍵
26 VK_UP ↑(Up Arrow)鍵
27 VK_RIGHT →(Right Arrow)鍵
28 VK_DOWN ↓(Down Arrow)鍵
29 VK_SELECT Select鍵
2A -- OEM保留
2B VK_EXECUTE Execute鍵
2C VK_SNAPSHOT Print Screen鍵
2D VK_INSERT Insert鍵
2E VK_DELETE Delete鍵
2F VK_HELP Help鍵
30-39 VK_0-VK_9 數字鍵0-9
3A-40 -- 未定義
41-5A VK_A-VK_Z 字母鍵A-Z
5B-5F -- 未定義
60-69 VK_NUMPAD0-VK_NUMPAD9 小鍵盤數字鍵0-9
6A VK_MULTIPLY *(乘號)鍵
6B VK_ADD +(加號)鍵
6C VK_SEPAPATOR 分隔符鍵
6E VK_SUBTRACT -(減號)鍵
6F VK_DECIMAL .(小數點)鍵
70-87 VK_DIVIDE /(除號)鍵
88-8F VK_F1-VK_F24 F1-F24功能鍵
90 VK_NUMBERLOCK Number lock鍵
91 VK_SCROLL Scroll lock鍵
92-B9 -- 未定義
BA-C0 -- OEM保留
C1-DA -- 未定義
DB_E4 -- OEM保留
E5 -- 未定義
E6 -- OEM保留
E7-E8 -- 未定義
E9-F5 -- OEM保留
F6-FE -- 未定義
2.輸入焦點
同一時刻,Windows中可能有多個不同的程序在運行,也就是說有多個窗口同時存在。這時,鍵盤由多個窗口共享,但只有一個窗口能夠接收到鍵盤消息,這個能夠接收鍵盤消息的窗口被稱為擁有輸入焦點的窗口。
擁有輸入焦點的窗口應該是當前的活動窗口,或者是活動窗口的子窗口,其標題和邊框會以高亮度顯示,以區別於其他窗口。擁有輸入焦點的也可以是圖標而不是窗口,此時,Windows也將消息發送給圖標,只是消息的格式略有不同。
窗口過程可以通過發送WM_SETFOCUS和 WM_KILLFOCUS消息使窗體獲得或失去輸入焦點。程序也可以通過捕獲WM_SETFOCUS和WM_KILLFOCUS消息來判斷窗體何時獲得或失去輸入焦點。其中WM_SETFOCUS消息表示窗口正獲得輸入焦點,WM_ KILLFOCUS消息表示窗口正失去輸入焦點。
3.鍵盤消息
鍵盤消息分為系統鍵消息和非系統鍵消息。系統鍵消息是指由Aft鍵和其他鍵組合而產生的按鍵消息。當系統鍵被按下時產生WM_ SYSKEYDOWN消息,當系統鍵被釋放時產生WM_SYSKEYUP消息。 Aft鍵與其他鍵形成的組合鍵通常用於對程序菜單和系統菜單進行選擇,或用於在不同的程序之間進行切換。因此,系統鍵消息應該交由Windows進行處理,用戶所編制的程序一般不處理系統鍵消息,而是將這些消息交由DefWindowProc函數進行處理。如果用戶想對系統鍵消息進行處理,應該在處理完這些消息後,再將其發送給DefWindowProc函數,使得Windows系統能夠正常工作。
某些擊鍵消息可以被轉換成字元消息,例如字母鍵、數字鍵等。而有些鍵只能產生按鍵消息而沒有字元消息,例如 Shift鍵、Insert鍵等。消息循環中的 TranslateMessage函數可以實現從擊鍵消息向字元消息的轉化。當GetMessage函數捕獲一個WM_SYSKEYDOWN消息或 WM_KEYDOWN消息後,TranslateMessage函數判斷產生該消息的鍵是否能夠被轉換成字元消息,如果能,就將該消息轉換成字元消息,再通過DispatchMessape函數將轉換後的字元消息發送到消息隊列中去。字元消息共有以下四種,如表所示。
字元 系統字元 非系統字元
普通字元 WM_SYSCHAR WM_CHAR
死字元 WM_SYSDEADCHAR WM_DEADCHAR
其中死字元是由某些特殊鍵盤上的按鍵所造成的,Windows一般忽略死字元所產生的消息。
Windows的消息一般是通過一個MSG結構體變數傳送給消息處理函數的。對於鍵盤消息, MSG結構體變數的各個域中較重要的是lParam域和 wParam域。wParam域用於保存按鍵的虛擬鍵代碼或字元的ASCII碼。對於非字元消息,wParam域保存按鍵的虛擬健代碼;對於字元消息, wParam域不保存字元的ASCII碼。lParam域則用於保存擊鍵時產生的附加信息,實際上一個32位的lParam變數被分為六部分,記錄了以下相關信息:重復次數、OEM掃描碼、擴展鍵標志、關聯鍵標志、前一擊鍵狀態和轉換狀態。lParam域各位的含義如表所示。
位數 含義
0-15 擊鍵重復次數累加
16-23 OEM掃描碼
24 是否為擴展鍵
25-28 未定義
29 是否便用關聯鍵,及Alt鍵是否同時按下。
30 前一次擊鍵狀態,0表示該鍵前一次狀態為抬起,1表示前一次狀態為按下
31 轉換狀態
按鍵的次序不同,產生的消息也不相同。例如,按下並釋放1鍵,讀過程依次產生如表所示三條消息。按下1鍵所產生的消息和wParam的取值
消息 wParam變數取值
WM_KEYDOWN 虛擬碼1
WM_CHAR ASCII碼「1」
WM_KEYUP 虛擬碼1
如果按下Shift鍵後再按下1鍵並釋放,則依次產生如表所示的消息。按下 Shift鍵後按 1健所產生的消息和 wParam的取值
消息 wParam變數取值
WM_KEYDOWN 虛擬碼 VK_SHIFT
WM_KEYDOWN 虛擬碼 VK_1
WM_CHAR ASCII碼「1」
WM_KEYUP 虛擬碼 VK_1
WM_KEYUP 虛擬碼 VK_SHIF
鍵盤應用實例
下面通過一個應用程序實例來說明在實際編程中如何處理鍵盤消息。
#include
#include
// 全局變數
RECT rc; //記錄滾屏的矩形區域
int xChar, yChar; //文本輸入點坐標
WNDCLASSEX wnd; //窗口類結構變數
char szAppName[] = "鍵盤消息監視程序"; //窗口類名
//函數聲明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow);
//函數:WinMain
//作用:入口函數
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
MSG msg;
if(!MyRegisterClass(hInstance))
{
return FALSE;
}
if(!InitInstance(hInstance,iCmdShow))
{
return FALSE;
}
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
//函數:ShowKey
//作用:實現在窗口中顯示按鍵信息
void ShowKey (HWND hwnd, int iType,char *szMessage,WPARAM wParam,LPARAM lParam)
{
static char *szFormat[2] ={"%-14s %3d %c %6u %4d %5s %5s %6s %6s",
"%-14s %3d %c %6u %4d %5s %5s %6s %6s" };
char szBuffer[80];
HDC hdc;
ScrollWindowEx(hwnd, 0, -yChar, &rc,&rc,NULL,NULL,SW_INVALIDATE);
hdc = GetDC (hwnd);
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
TextOut (hdc,
xChar,
rc.bottom - yChar,
szBuffer,
wsprintf szBuffer,
szFormat[iType],
szMessage, //消息
wParam, //虛擬鍵代碼
(BYTE) (iType ? wParam :『 』),//顯示字元值
LOWORD (lParam), // 重復次數
HIWORD (lParam) & 0xFF, // OEM鍵盤掃描碼
//判斷是否為增強鍵盤的擴展鍵
(PSTR) (0x01000000 & lParam ? 「是」 : 「否」),
//判斷是否同時使用了ALT鍵
(PSTR) (0x20000000 & lParam ? 「是」 : 「否」),
(PSTR) (0x40000000 & lParam ? 「按下」 : 「抬」),
//判斷前一次擊鍵狀
(PSTR)(0x80000000 & lParam ? 「按下」 : 「抬起」))
//判斷轉換狀態?
);
ReleaseDC (hwnd, hdc); ?
ValidateRect (hwnd, NULL); ?
}
//函數:WndProc
//作用:處理主窗口的消息
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static char szTop[] ="消息鍵 字元 重復數 掃描碼 擴展碼 ALT 前一狀態 轉換狀態";
static char szUnd[] ="_______ __ ____ _____ ______ ______ ___ _______ ______";
//在窗口中輸出文字作為信息標題
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
switch (iMsg)
{
case WM_CREATE://處理窗口創建的消息
hdc = GetDC (hwnd); //設定字體
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); //檢取當前字體的度量數據
GetTextMetrics (hdc, &tm);
xChar = tm.tmAveCharWidth;//保存字體平均寬度
yChar = tm.tmHeight; //保存字體高度
ReleaseDC (hwnd, hdc);
rc.top = 3 * yChar / 2;
return 0;
case WM_SIZE://處理窗口大小改變的消息
//窗體改變後保存新的滾屏區域右下角坐標
rc.right = LOWORD (lParam);
rc.bottom = HIWORD (lParam);
UpdateWindow (hwnd);
return 0;
case WM_PAINT: //處理窗口重繪消息
InvalidateRect (hwnd, NULL, TRUE);
hdc = BeginPaint (hwnd, &ps);
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, xChar, yChar / 2, szTop, (sizeof szTop) - 1) ;
TextOut (hdc, xChar, yChar / 2, szUnd, (sizeof szUnd) - 1) ;
EndPaint (hwnd, &ps);
return 0;
case WM_KEYDOWN:
//處理鍵盤上某一鍵按下的消息
ShowKey (hwnd, 0, "WM_KEYDOWN",wParam, lParam);
return 0;
case WM_KEYUP:
//處理鍵盤上某一按下鍵被釋放的消息
ShowKey (hwnd, 0, "WM_KEYUP", wParam, lParam);
return 0;
case WM_CHAR:
//處理擊鍵過程中產生的非系統鍵的可見字元消息
howKey (hwnd, 1, "WM_CHAR", wParam, lParam);
return 0;
case WM_DEADCHAR:
//處理擊鍵過程中產生的非系統鍵"死字元"消息
ShowKey (hwnd, 1, "WM_DEADCHAR", wParam, lParam);
return 0;
case WM_SYSKEYDOWN:
//處理系統鍵按下的消息
ShowKey (hwnd, 0, "WM_SYSKEYDOWN",wParam, lParam);
break;
case WM_SYSKEYUP:
//處理系統鍵抬起的消息
ShowKey (hwnd, 0, "WM_SYSKEYUP", wParam, lParam);
break;
case WM_SYSCHAR://處理系統鍵可見字元消息
ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam);
break;
case WM_SYSDEADCHAR://處理系統鍵"死字元"消息
ShowKey (hwnd, 1, "WM_SYSDEADCHAR", wParam, lParam);
break;
case WM_DESTROY:
//處理結束應用程序的消息
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
//函數:MyRegisterClass
//作用:注冊窗口類
BOOL MyRegisterClass(HINSTANCE hInstance)
{
wnd.cbSize= sizeof (wnd);
wnd.style = CS_HREDRAW | CS_VREDRAW;
wnd.lpfnWndProc = WndProc;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hInstance = hInstance;
wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);?
wnd.hCursor = LoadCursor (NULL, IDC_ARROW);
wnd.hbrBackground = (HBRUSH)
GetStockObject (WHITE_BRUSH);
wnd.lpszMenuName = NULL;
wnd.lpszClassName = szAppName;
wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
return RegisterClassEx (&wnd);
}
//函數:InitInstance
//作用:創建主窗口
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow)
{
HWND hwnd;
hwnd = CreateWindow (szAppName,
"鍵盤消息監視程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
if(!hwnd)
{
return FALSE;
}
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
return TRUE;
}
Ⅸ 今天下了個按鍵精靈,有個 回車鍵按鍵虛擬碼是多少,我弄不好啊,丟。怎寫求高手
虛擬碼主要用於後台操作,如果是前台操作的話,就可以
KeyPress "Enter", 1 //普通的,有些識別不了
KeyPressS "Enter", 1 //超級的,基本所有的都能識別
如果你要的是虛擬碼做後台,可以輸入下面一局代碼,然後調試,你按下哪個按鍵,就彈出哪個按鍵的虛擬碼。
MessageBox WaitKey
調試結果,13
DoubleSong2011為你解惑,記得採納哦
Ⅹ 鍵盤 Alt 的虛擬鍵盤代碼是多少。
13(度娘簡略泥煤啊 就是13