本節包括以下內容:
系統通過(guò)安裝當前鍵盤(pán)的設備驅動(dòng)來(lái)實(shí)現與應用程序的設備無(wú)關(guān)性,也可以通過(guò)用戶(hù)或應用程序的鍵盤(pán)布局設置來(lái)實(shí)現語(yǔ)言無(wú)關(guān)性。鍵盤(pán)設備驅動(dòng)接收鍵盤(pán)的“掃描碼”,然后把“掃描碼”發(fā)送給鍵盤(pán)布局,通過(guò)鍵盤(pán)布局被轉換為消息并發(fā)送到應用程序的相應窗口。
鍵盤(pán)上每一個(gè)鍵都有一個(gè)唯一值,這個(gè)唯一值就稱(chēng)為“掃描碼”(scan code),對于鍵盤(pán)上每個(gè)鍵來(lái)說(shuō),“掃描碼”是設備相關(guān)的。當用戶(hù)按鍵時(shí)會(huì )產(chǎn)生兩次掃描碼,一次是按下鍵時(shí),一次是放開(kāi)時(shí)。
然后,鍵盤(pán)驅動(dòng)把掃描碼解釋并轉換(映射)為“虛鍵碼”(virtual-key code),這個(gè)碼是設備無(wú)關(guān)的,其值被系統所定義并用來(lái)標識每一個(gè)鍵。轉換掃描碼后,鍵盤(pán)布局會(huì )創(chuàng )建一個(gè)包含掃描碼、虛鍵碼以及其他按鍵信息的消息,并把這個(gè)消息放入系統消息隊列。接著(zhù),系統從系統消息隊列中刪除該消息,再投遞到相應線(xiàn)程的消息隊列中。最后,線(xiàn)程的消息循環(huán)移除該消息并傳遞到相應窗口過(guò)程以進(jìn)行處理。下圖即鍵盤(pán)輸入模型:

系統投遞鍵盤(pán)消息到前臺線(xiàn)程的消息隊列中,這個(gè)前臺線(xiàn)程應該是創(chuàng )建當前獲得焦點(diǎn)的窗口的線(xiàn)程。鍵盤(pán)聚焦(Keyboard focus)是一個(gè)窗體的臨時(shí)屬性。系統通過(guò)鍵盤(pán)聚焦來(lái)向所有的顯示窗體共享鍵盤(pán),從用戶(hù)的角度講,鍵盤(pán)聚焦也就意味著(zhù),從一個(gè)窗口轉到另外一個(gè)。獲取焦點(diǎn)的窗口接收(從創(chuàng )建它的線(xiàn)程的消息隊列中)接收所有的鍵盤(pán)消息,直到焦點(diǎn)轉移到另外的窗體上。
線(xiàn)程可以通過(guò)調用GetFocus函數來(lái)確定那個(gè)窗口為當前窗口(已經(jīng)鍵盤(pán)聚焦),也可以通過(guò)SetFocus來(lái)使哪個(gè)窗口獲取焦點(diǎn)。當鍵盤(pán)聚焦從一個(gè)窗口換到另外一個(gè)時(shí),系統會(huì )發(fā)送WM_KILLFOCUS到失去焦點(diǎn)的窗口,然后發(fā)送WM_SETFOCUS消息到獲得焦點(diǎn)的窗口。
鍵盤(pán)聚焦與活動(dòng)窗口有一定關(guān)系,活動(dòng)窗口(active window)是最上層用戶(hù)正在操作的窗口。鍵盤(pán)聚焦的窗體或者是活動(dòng)窗體,或者是活動(dòng)窗體的子窗體。為了幫助用戶(hù)辨別活動(dòng)窗體,系統把它置于Z-order的最上層,并高亮它的標題欄及邊框。
用戶(hù)可以通過(guò)點(diǎn)擊來(lái)激活一個(gè)頂級窗體,也可以用ALT+TAB(ALT+ESC)組合鍵或者通過(guò)任務(wù)列表來(lái)選擇一個(gè)窗體。線(xiàn)程可以通過(guò)SetActiveWindow函數來(lái)激活一個(gè)頂級窗體,也可以通過(guò)GetActiveWindow函數來(lái)確定它創(chuàng )建的頂級窗體是否已被激活。
當一個(gè)窗體的活動(dòng)狀態(tài)變更時(shí),系統會(huì )發(fā)送WM_ACTIVATE消息。wParam參數的低字(譯者注:wParam在Win32中是一個(gè)32位的整數,從高到低依次編碼的話(huà)應該是31、30、29、……、2、1、0,低字指的是15到0)部分 如果為0表示窗體未激活,否則表示激活。默認的窗口處理過(guò)程收到WM_ACTIVATE消息時(shí),會(huì )設置鍵盤(pán)聚焦到活動(dòng)窗口。
要阻止應用程序接收鍵盤(pán)及鼠標事件的話(huà),可以使用BlockInput。需要注意的是,BlockInput函數不會(huì )影響異步的鍵盤(pán)輸入狀態(tài)表,也就是說(shuō),當輸入被阻塞時(shí),調用SendInput函數會(huì )改變異步鍵盤(pán)輸入狀態(tài)表。(譯者注:原文直譯可能讓人更加摸不著(zhù)北,應該是說(shuō),BlockInput函數不會(huì )影響異步的鍵盤(pán)輸入,這個(gè)時(shí)候,調用SendInput的話(huà),還是會(huì )改變異步的鍵盤(pán)輸入狀態(tài)信息)。
按下鍵會(huì )產(chǎn)生WM_KEYDOWN或WM_SYSKEYDOWN消息,然后會(huì )被放置在當前鍵盤(pán)聚焦的窗口所在線(xiàn)程的消息隊列中。同樣釋放按鍵也會(huì )產(chǎn)生消息,這個(gè)消息將會(huì )是WM_KEYUP或者WM_SYSKEYUP。
Key-up與Key-down消息通常應該成對出現,但如果用戶(hù)按下鍵后呆足夠長(cháng)時(shí)間的話(huà),鍵盤(pán)會(huì )自動(dòng)重復描述這一情況,系統會(huì )對應產(chǎn)生一系列的WM_KEYDOWN或WM_SYSKEYDOWN事件,但不管怎樣,用戶(hù)釋放按鍵時(shí),只會(huì )產(chǎn)生一個(gè)WM_KEYUP或WM_SYSKEYUP消息。
本節包括以下內容:
系統中系統按鍵與非系統按鍵是截然不同的,系統按鍵產(chǎn)生系統按鍵消息:WM_SYSKEYDOWN、WM_SYSKEYUP,而非系統按鍵產(chǎn)生非系統按鍵消息:WM_KEYDOWN與WM_KEYUP。
如果你的窗口處理過(guò)程確實(shí)有必要處理系統按鍵消息的話(huà),一定要確認在處理完畢后,該過(guò)程把消息傳遞給了DefWindowProc函數。否則,所有的系統操作,包括ALT鍵都會(huì )失效,即便窗口的確獲得了焦點(diǎn)。也就是說(shuō),用戶(hù)將不能訪(fǎng)問(wèn)窗口菜單或者系統菜單,又或者使用ALT+ESC(ALT+TAB)組合鍵激活其他窗口了。
系統按鍵消息主要是系統使用的,系統用這些消息提供菜單的內置鍵盤(pán)接口,以及允許用戶(hù)控制激活不同的窗口。系統按鍵消息通常是用戶(hù)按下ALT及某個(gè)鍵的組合鍵時(shí)產(chǎn)生的,又或者在用戶(hù)按下但沒(méi)有窗體擁有鍵盤(pán)焦點(diǎn)(比如,激活的應用程序最小化)時(shí)產(chǎn)生。如果消息產(chǎn)生的話(huà),就會(huì )發(fā)送到激活窗體的消息隊列中。
非系統按鍵消息是需要應用程序窗體處理的,DefWindowProc函數不會(huì )對這些消息作任何處理,窗體的處理過(guò)程可以忽略任意的不需要的非系統按鍵消息。
按鍵消息的wParam參數包含了按鍵的虛鍵碼,窗口處理過(guò)程根據這個(gè)虛鍵碼來(lái)處理或者忽略一個(gè)按鍵消息。
典型的窗口處理過(guò)程中僅會(huì )處理一小部分按鍵消息,其余的部分只是簡(jiǎn)單的接收并忽略。例如,窗口處理過(guò)程可能僅處理WM_KEYDOWN消息,以及光標移動(dòng)鍵、換檔鍵(也可以說(shuō)控制鍵),還有功能鍵的虛鍵碼。窗口處理過(guò)程中一般不會(huì )處理字符鍵的按鍵消息,相反,應該使用TranslateMessage函數把它們轉換成字符消息。關(guān)于TranslateMessage與字符消息的更多信息,請參見(jiàn)字符消息(Character Message)。
按鍵消息的lParam消息中包含了按鍵的額外信息,其中包括:重復次數、掃描碼、擴充鍵標志、上下文標志、前鍵狀態(tài)標志,以及轉換狀態(tài)標志。下圖指示了這些標志及值在lParam中的位置:

按鍵標志中可以存儲以下值:
| KF_ALTDOWN | ALT鍵標志,標識ALT鍵是否按下。 |
| KF_DLGMODE | 對話(huà)框標志,標識對話(huà)框是否激活。 |
| KF_EXTENDED | 擴充鍵標志 |
| KF_MENUMODE | 菜單模式標志,標識菜單是否激活。 |
| KF_REPEAT | 重復次數 |
| KF_UP | 轉換狀態(tài)標志 |
你可以通過(guò)檢查重復次數,來(lái)確定一次按鍵是否產(chǎn)生了多個(gè)按鍵消息。如果鍵盤(pán)產(chǎn)生WM_KEYDOWN或WM_SYSKEYDOWN消息后,超過(guò)一定時(shí)間應用程序還未處理這些消息的話(huà),系統就會(huì )增加重復計數。通常,是因為用戶(hù)保持按鍵狀態(tài)較長(cháng)時(shí)間,而啟動(dòng)了鍵盤(pán)的自動(dòng)重復技術(shù)機制。系統不會(huì )因此產(chǎn)生多個(gè)鍵盤(pán)消息,相反,系統會(huì )組合這些消息,并增加這個(gè)消息的重復次數。釋放一個(gè)按鍵時(shí)不會(huì )啟動(dòng)自動(dòng)重復機制,所以WM_KEYUP與WM_SYSKEYUP消息的重復次數總會(huì )是1。
掃描碼是用戶(hù)按鍵時(shí)由鍵盤(pán)硬件產(chǎn)生的,這個(gè)值是設備相關(guān)的,用來(lái)標識不同的鍵,對于字符也是通過(guò)按鍵來(lái)表示的。應用程序通常會(huì )忽略?huà)呙璐a,實(shí)際上,它使用設備無(wú)關(guān)的虛鍵碼來(lái)說(shuō)明按鍵消息。
擴充鍵標志用來(lái)標識按鍵消息中是否包含了增強型鍵盤(pán)的附加鍵,這些擴充鍵包括:鍵盤(pán)右手邊的ALT、CTRL鍵,INS、DEL、HOME、END、PAGE UP、PAGE DOWN,小鍵盤(pán)左邊的方向鍵,NUM LOCK、BREAK(CTRL+PAUSE)、PRINT SCRNT以及小鍵盤(pán)上的除號(/)鍵及ENTER鍵。如果鍵為以上鍵的話(huà),擴充鍵標志即會(huì )設置。
上下文標志是為了說(shuō)明按鍵消息產(chǎn)生時(shí),ALT鍵是否已經(jīng)按下,如果為1,表示ALT鍵已經(jīng)按下,否則沒(méi)有按下。
前鍵狀態(tài)標志用來(lái)說(shuō)明產(chǎn)生按鍵消息的鍵原來(lái)是抬起的還是按下的。如果為1,表示原來(lái)是按下的,0原來(lái)是抬起的。你可以通過(guò)該標志來(lái)辨別該消息是否是由鍵盤(pán)自動(dòng)重復機制產(chǎn)生的。如果為1,表示W(wǎng)M_KEYDOWN與WM_SYSKEYDOWN消息是自動(dòng)產(chǎn)生的,對于WM_KEYUP與WM_SYSKEYUP消息來(lái)說(shuō),該標志總會(huì )為0。
轉換狀態(tài)標志用來(lái)說(shuō)明該消息是按下鍵時(shí)還是釋放鍵時(shí)產(chǎn)生的,對于WM_KEYDOWN、WM_SYSKEYDOWN來(lái)說(shuō)該標志總會(huì )為0,對于WM_KEYUP、WM_SYSKEYUP總會(huì )是1。
按鍵消息可以提供許多按鍵的基本信息,但卻不提供字符鍵的字符碼,要想得到字符碼,應用程序必須在自己的線(xiàn)程循環(huán)中包含TranslateMessage函數,TranslateMessage傳遞WM_KEYDOWN或WM_SYSKEYDOWN消息到鍵盤(pán)布局,通過(guò)檢查消息的虛鍵碼,如果發(fā)現它是一個(gè)字符鍵的話(huà),鍵盤(pán)布局就會(huì )提供一個(gè)字符碼的等價(jià)物(會(huì )考慮SHIFT及CAPS LOCK鍵的狀態(tài)),然后產(chǎn)生一個(gè)包括字符碼的字符消息,并放到消息隊列的頭部。消息循環(huán)的下一次處理就會(huì )把字符消息從隊列中刪除,并分發(fā)給相應的窗口處理過(guò)程。
本節包含以下內容:
在窗口的處理過(guò)程中可以處理如下的字符消息:
應用程序處理鍵盤(pán)輸入時(shí)通常會(huì )忽略除WM_CHAR與WM_UNICHAR外的所有消息,只是把它們傳遞給DefWindowProc函數。注意:WM_CHAR使用了16位Unicode轉換格式(UTF),WM_UNICHAR使用了UTF-32格式。系統使用WM_SYSCHAR及WM_SYSDEADCHAR消息實(shí)現了菜單助記符的工程。
所有字符消息中的wParam參數包含了字符鍵的字符碼,其值取決于接收消息的窗口的窗口類(lèi),如果是用的RegisterClass函數的Unicode版本注冊的窗口類(lèi),系統就會(huì )向所有那個(gè)類(lèi)的窗口實(shí)例提供Unicode字符,否則就是ASCII字符碼,更多信息,請參照Unicode及字符集。
字符消息中lParam參數值與key-down消息中lParam參數值相同。更多信息,參照按鍵消息標志。
有些非English鍵盤(pán)中,包含一些本身不產(chǎn)生字符的字符鍵,它們只是用來(lái)為后續的按鍵提供一個(gè)區分(譯者注:或者應該說(shuō)是,為了區分后續的按鍵吧)。這些鍵就被稱(chēng)為無(wú)用鍵(dead keys),These keys are called dead keys. 德文鍵盤(pán)中的揚聲符就是一個(gè)無(wú)用鍵的例子,為了輸入由“o”及揚聲符組成的符號(譯者注:應該是類(lèi)似“ó”的符號),德文的用戶(hù)需要按下?lián)P聲符鍵,然后是“o”鍵。獲得焦點(diǎn)的窗口就會(huì )收到以下消息序列:
當TranslateMessage處理無(wú)用鍵的WM_KEYDOWN消息時(shí),就會(huì )產(chǎn)生WM_DEADCHAR消息,盡管WM_DEADCHAR消息的wParam參數中包含了揚聲符這個(gè)無(wú)用鍵的字符碼,但應用程序通常會(huì )忽略這個(gè)消息,而會(huì )接著(zhù)處理后續按鍵的WM_CHAR消息。WM_CHAR消息的WM_CHAR參數中包含了那個(gè)字母與揚聲符的字符碼。如果后續的按鍵產(chǎn)生的字符不能與揚聲符組合,系統就會(huì )產(chǎn)生兩個(gè)WM_CHAR消息,第一個(gè)消息的wParam參數中包含了揚聲符的字符碼,第二個(gè)消息的wParam參數中包含了后續字符鍵的字符碼。
當TranslateMessage處理一個(gè)系統無(wú)用鍵(與ALT的組合鍵)的WM_SYSKEYDOWN消息時(shí),就會(huì )產(chǎn)生WM_SYSDEADCHAR消息。應用程序通常忽略WM_SYSDEADCHAR消息。
處理鍵盤(pán)消息時(shí),應用程序除了需要處理當前按鍵消息的那個(gè)按鍵外,還可能需要確定另外一個(gè)鍵的狀態(tài)。比如,一個(gè)字處理軟件,可能允許用戶(hù)使用SHIFT+END來(lái)選擇一個(gè)文本塊,那這個(gè)應用程序就必須在任意收到END鍵的按鍵消息時(shí),檢驗SHIFT鍵是否已按下。應用程序可以處理當前的按鍵消息時(shí)使用GetKeyState函數來(lái)確定一個(gè)虛鍵的狀態(tài),也可以通過(guò)
鍵盤(pán)布局維護著(zhù)一個(gè)按鍵名稱(chēng)列表,僅產(chǎn)生一個(gè)字符的按鍵的名稱(chēng)與按鍵的名稱(chēng)相同,非字符鍵如TAB、ENTER的名稱(chēng)以字符串的形式存儲。應用程序可以通過(guò)調用GetKeyNameText函數來(lái)從設備驅動(dòng)中得到任意鍵的名稱(chēng)。
系統包含若干特殊用途的函數來(lái)轉換掃描碼、字符碼、以及虛鍵碼,這些函數包括:MapVirtualKey,ToAscii,ToUnicode及VkKeyScan。
另外,Microsoft® Rich Edit 3.0
一個(gè)熱鍵是一個(gè)可以產(chǎn)生WM_HOTKEY消息的鍵組合,系統會(huì )把這個(gè)消息放置到消息隊列的頂部,而繞開(kāi)任何隊列中已有的消息。應用程序使用熱鍵可以向用戶(hù)提供更高優(yōu)先級的鍵盤(pán)輸入,例如,通過(guò)定義CTRL+C組合鍵,應用可以使用戶(hù)避免冗長(cháng)的操作。
要定義熱鍵的話(huà),應用程序需要調用RegisterHotKey函數來(lái)指定一個(gè)可以產(chǎn)生WM_HOTKEY的組合鍵,再傳入接收消息的窗體的handle以及熱鍵的唯一標識就可以了。用戶(hù)按下熱鍵時(shí),創(chuàng )建那個(gè)窗體的線(xiàn)程的消息隊列中就會(huì )收到WM_HOTKEY。消息中的wParam參數包含熱鍵的標識。應用程序可以在一個(gè)線(xiàn)程中定義多個(gè)熱鍵,但每個(gè)熱鍵必須有一個(gè)唯一標識。應用程序終止前,應該調用UnregisterHotKey函數來(lái)撤銷(xiāo)熱鍵。
應用程序可以使用一個(gè)熱鍵控件,使得用戶(hù)能夠方便自定義熱鍵,熱鍵控件通常用來(lái)定義一個(gè)熱鍵,使得能夠激活一個(gè)窗口,他們不使用RegisterHotKey及UnregisterHotKey函數,相反,使用熱鍵控件的應用程序通常發(fā)送WM_SETHOTKEY消息來(lái)設置熱鍵,無(wú)論何時(shí),用戶(hù)按下熱鍵,系統會(huì )發(fā)送一個(gè)指定SC_HOTKEY的WM_SYSCOMMAND消息。詳細信息,可參照“應用熱鍵控件”。
Microsoft Windows®可以支持某些特殊鍵:瀏覽器功能鍵、媒體功能鍵、應用程序載入鍵以及電源管理鍵。WM_APPCOMMAND可以提供這些特殊鍵的支持。另外,ShellProc也被修改為可以支持額外鍵的函數了。
在一個(gè)組件應用程序中的一個(gè)子窗體直接執行這些額外鍵的命令是不太可能的,因此,一旦有這樣的鍵按下的話(huà),DefWindowProc將發(fā)送一個(gè)WM_APPCOMMAND消息到一個(gè)窗體,DefWindowProc也會(huì )(冒泡式的)引發(fā)(bubble)父窗體處理WM_APPCOMMAND消息。 這同點(diǎn)擊鼠標右鍵彈出上下文菜單的模式類(lèi)似,DefWindowProc在鼠標右擊時(shí)發(fā)送一個(gè)WM_CONTEXTMENU消息,冒泡式的到它的父親。需要額外說(shuō)明的是,如果DefWindowProc收到一個(gè)給頂級窗體的WM_APPCOMMAND消息的話(huà),就會(huì )以HSHELL_APPCOMMAND代碼調用一個(gè)外殼鉤子(shell hook)。
Windows也支持Microsoft IntelliMouse® Explorer,它是一個(gè)有五個(gè)按鍵的鼠標。兩個(gè)額外鍵支持瀏覽器的前進(jìn)后退。更多信息,請參照
要模擬一個(gè)連續的一系列的用戶(hù)輸入,就可以使用SendInput函數。這個(gè)函數需要三個(gè)參數:第一個(gè)參數cInputs,表示將要模擬的輸入事件的個(gè)數(INPUT數組的大?。?;第二個(gè)參數rgInputs,是INPUT結構的數組,每個(gè)元素都描述了輸入事件類(lèi)型及事件的附加信息;最后一個(gè)是cbSize,是按字節計的INPUT結構的大小。
SendInput函數通過(guò)向設備輸入流中注入一系列的模擬事件來(lái)實(shí)現模擬輸入,效果類(lèi)似于重復調用keybd_event或mouse_event函數,除了系統需要確認模擬事件件沒(méi)有插入其他輸入事件。一旦調用結束,其返回值就會(huì )指出有幾個(gè)輸入事件成功運行了,如果為0,則說(shuō)明輸入被阻塞了。
SendInput函數不會(huì )重設當前的鍵盤(pán)狀態(tài),因此,如果調用此函數時(shí),用戶(hù)已經(jīng)按下了什么鍵的話(huà),就可能被函數產(chǎn)生的事件所干擾,如果你擔心潛在的沖突的話(huà),可以用GetAsyncKeyState函數檢查鍵盤(pán)狀態(tài),并按需要糾正。
語(yǔ)言指的是自然語(yǔ)言,如English、French及Japanese,子語(yǔ)言是某個(gè)特定地理區域的自然語(yǔ)言的變種,如英語(yǔ)的子語(yǔ)言就包括England語(yǔ)及美國英語(yǔ)。而應用程序所指的是語(yǔ)言標識,用來(lái)唯一的辨別語(yǔ)言及子語(yǔ)言。
應用程序通常使用場(chǎng)所(locales)來(lái)設置指定輸入輸出的語(yǔ)言,例如設置鍵盤(pán)的場(chǎng)所會(huì )影響鍵盤(pán)產(chǎn)生的字符值;設置顯示器或打印機的場(chǎng)所會(huì )影響字形顯示或打印。應用程序通過(guò)調入使用鍵盤(pán)布局來(lái)設置場(chǎng)所,通過(guò)選擇指定場(chǎng)所所支持的字體來(lái)設置顯示器或打印機的場(chǎng)所。
鍵盤(pán)布局不僅是用來(lái)自定按鍵的物理位置,而且也是用來(lái)確定那些按鍵所決定的字符值的。每個(gè)布局表示當前的輸入語(yǔ)言,也用來(lái)確定哪個(gè)或哪些鍵組合可以產(chǎn)生哪些字符值。
每種鍵盤(pán)布局都有相應的標識布局及語(yǔ)言的句柄(handle),句柄的低字部分是語(yǔ)言標識符,高字部分是設備句柄(描述了物理布局),或者為0,表示使用默認的物理布局。用戶(hù)可以用任意的輸入語(yǔ)言聯(lián)合到一個(gè)物理布局上。如,說(shuō)English的用戶(hù),可能不時(shí)地要去French工作,他就可以設置輸入語(yǔ)言為French,而不用變更鍵盤(pán)物理布局,這也意味著(zhù)用戶(hù)可以用自己熟悉的English布局輸入French文字。
應用程序不要想直接操作輸入語(yǔ)言,相反,用戶(hù)可以設置語(yǔ)言與布局的組合,然后在他們之間交替變更。當用戶(hù)點(diǎn)擊進(jìn)入一個(gè)不同語(yǔ)言的文本中時(shí),應用程序調用
ActiveKeyboardLayout函數為當前任務(wù)設置輸入語(yǔ)言,hkl參數可以是鍵盤(pán)布局的句柄或者0擴充的語(yǔ)言標識,鍵盤(pán)布局句柄可以通過(guò)LoadKeyboardLayout或GetKeyboardLayoutList函數獲得,HKL_NEXT及HKL_PREV也可以用來(lái)選擇下一個(gè)或者上一個(gè)鍵盤(pán)。
LoadKeyboardLayout函數調入一個(gè)鍵盤(pán)布局并使它對用戶(hù)可用。應用程序可以通過(guò)使用KLF_ACTIVATE使得布局立即對當前線(xiàn)程可用,如果沒(méi)有指定KLF_ACTIVATE也可以使用KLF_REORDER重新設置布局。應用程序應該在調入鍵盤(pán)布局時(shí)使用KLF_SUBSTITUTE_OK,以便確保用戶(hù)的優(yōu)先設置,如果有,就會(huì )被選擇。
要多語(yǔ)言支持的話(huà),LoadKeyboardLayout提供KLF_REPLACELANG與KLF_NOTELLSHELL標志。KLF_REPLACELANG標志可以不用改變語(yǔ)言而直接替換為一個(gè)存在的鍵盤(pán)布局。嘗試替換為一個(gè)相同語(yǔ)言標識的已存在的布局,不指定KLF_REPLACELANG是錯誤的。KLF_NOTELLSHELL標志會(huì )組織函數在布局添加或替換時(shí)通知shell。 在連續的一系列調用中,這很有用,除了最后一次調用外,其他調用都應該使用該標志。
聯(lián)系客服