版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、鍵盤(鍵盤基礎(chǔ),按鍵 消息)在microsoft windows 98中,鍵盤和鼠標是兩個標準 的使用者輸入來源,在一些連貫操作中常產(chǎn)生互補作 用。當然,鼠標在今天的應用程序中比十年前使用得 更為廣泛。甚至在一些應用程序中,我們更習慣于使 用鼠標,例如在游戲、畫圖程序、音樂程序以及web 瀏覽器等程序中就是這樣。然而,我們可以不使用鼠 標,但絕對不能從一般的pc中把鍵盤拆掉。相對于個人計算機的其它組件,鍵盤有非常久遠的歷 史,它起源于1874年的第一臺remington打字機。早 期的計算機程序員用鍵盤在hollerith卡片上打孔,后 來在終端機上用鍵盤直接與大型主機溝通。pc上的鍵 盤在某
2、些方面進行了擴充,加上了功能鍵、光標移動 鍵和單獨的數(shù)字鍵盤,但它們的輸入原理基本相同。鍵盤基礎(chǔ)您大概已經(jīng)猜到windows程序是如何獲得鍵盤輸入 的:鍵盤輸入以消息的形式傳遞給程序的窗口消息處 理程序。實際上,第一次學習消息時,鍵盤事件就是 一個消息如何將不同型態(tài)信息傳遞給應用程序的顯 例。windows用八種不同的消息來傳遞不同的鍵盤事件。 這好像太多了,但是(就像我們所看到的一樣)程序 可以忽略其中至少一半的消息而不會有任何問題。并 且,在大多數(shù)情況下,這些消息中包含的鍵盤信息會 多于程序所需要的。處理鍵盤的部分工作就是識別出 哪些消息是重要的,哪些是不重要的。忽略鍵盤雖然鍵盤是wind
3、ows程序中使用者輸入的主要來源, 但是程序不必對它接收的所有消息都作出響應。windows本身也能處理許多鍵盤功能。例如,您可以忽略那些屬于系統(tǒng)功能的按鍵,它們通 常用到alt鍵。程序不必監(jiān)視這些按鍵,因為windows 會將按鍵的作用通知程序(當然,如果程序想這么做, 它也能監(jiān)視這些按鍵)。雖然呼叫程序菜單的按鍵將通 過窗口的窗口消息處理程序,但通常內(nèi)定的處理方式 是將按鍵傳遞給defwindowproco最終,窗口消息處 理程序?qū)@得一個消息,表示一個菜單項被選擇了。 通常,這是所有窗口消息處理程序需要知道的(在第 十章將介紹菜單)。有些windows程序使用鍵盤快捷鍵來啟動通用菜 單項
4、。快捷鍵通常是功能鍵或字母同ctrl鍵的組合(例 如,ctrl-s用于保存文件)。這些鍵盤快捷鍵與程序菜 單一起在程序的資源描述文件中定義(我們可以在第 十章看到)o windows將這些鍵盤快捷鍵轉(zhuǎn)換為菜'卩命 令消息,您不必自己去進行轉(zhuǎn)換。對話框也有鍵盤接口,但是當對話框處于活動狀態(tài)時, 應用程序通常不必監(jiān)視鍵盤。鍵盤接口由windows處 理,windows把關(guān)于按鍵作用的消息發(fā)送給程序。對 話框可以包含用于輸入文字的編輯控件。它們一般是 小方框,使用者可以在框中鍵入字符串。windows處 理所有編輯控件邏輯,并在輸入完畢后,將編輯控件 的最終內(nèi)容傳送給程序。關(guān)于對話框的詳細信
5、息,請 參見第一章。編輯控件不必局限于單獨一行,而且也不限于只在對 話框中。一個在程序主窗口內(nèi)的多行編輯控件就能夠 作為一個簡單的文字編輯器了(參見第九、十、十一 和十三章的poppad程序)o windows甚至有一個rich text文字編輯控件,允許您編輯和顯示格式化的文字(請參見 /platform sdk/user interface services/controls/rich edit controls) 0您將會發(fā)現(xiàn),在開發(fā)windows程序時,可以使用處理 鍵盤和鼠標輸入的子窗口控件來將較高層的信息傳遞 回父窗口。只要這樣的控件用得夠多,您就不會因處 理鍵盤消息而煩惱了。誰獲
6、得了焦點與所有的個人計算機硬件一樣,鍵盤必須由在 windows下執(zhí)行的所有應用程序共享。有些應用程序 可能有多個窗口,鍵盤必須由該應用程序內(nèi)的所有窗 口共享?;叵胍幌?,程序用來從消息隊列中檢索消息的msg 結(jié)構(gòu)包括hwnd字段。此字段指出接收消息的窗口控 件碼。消息循環(huán)中的dispatchmessage函數(shù)向窗口消 息處理程序發(fā)送該消息,此窗口消息處理程序與需要 消息的窗口相聯(lián)系。在按下鍵盤上的鍵時,只有一個 窗口消息處理程序接收鍵盤消息,并且此消息包括接 收消息的窗口控件碼。接收特定鍵盤事件的窗口具有輸入焦點。輸入焦點的 概念與活動窗口的概念很相近。有輸入焦點的窗口是 活動窗口或活動窗口的
7、衍生窗口(活動窗口的子窗口, 或者活動窗口子窗口的子窗口等等)。通常很容易辨別活動窗口。它通常是頂層窗口一也就 是說,它的父窗口句柄是null。如果活動窗口有標 題列,windows將突出顯示標題列。如果活動窗口具 有對話框架(對話框中很常見的格式)而不是標題列, windows將突出顯示框架。如果活動窗口目前是最小 化的,windows將在工作列中突出顯示該項,其顯示 就像一個按下的按鈕。如果活動窗口有子窗口,那么有輸入焦點的窗口既可 以是活動窗口也可以是其子窗口。最常見的子窗口有 類似以下控件:出現(xiàn)在對話框中的下壓按鈕、單選鈕、 復選框、滾動條、編輯方塊和清單方塊。子窗口不能 自己成為活動
8、窗口。只有當它是活動窗口的衍生窗口 時,子窗口才能有輸入焦點。子窗口控件一般通過顯 示一個閃爍的插入符號或虛線來表示它具有輸入焦 點。有時輸入焦點不在任何窗口中。這種情況發(fā)生在所有 程序都是最小化的時候。這時,windows將繼續(xù)向活 動窗口發(fā)送鍵盤消息,但是這些消息與發(fā)送給非最小 化的活動窗口的鍵盤消息有不同的形式。窗口消息處理程序通過攔截 wm_setfocus和 wm_killfocus消息來判定它的窗口何時擁有輸入 焦點。wm.setfocus指示窗口正在得到輸入焦點, wm_killfocus表示窗口正在失去輸入焦點。我將 在本章的后面詳細說明這些消息。隊列和同步當使用者按下并釋放鍵
9、盤上的鍵時,windows和鍵盤 驅(qū)動程序?qū)⒂布呙璐a轉(zhuǎn)換為格式消息。然而,這些 消息并不保存在消息隊列中。實際上,windows在所 謂的系統(tǒng)消息隊列中保存這些消息。系統(tǒng)消息隊 列是獨立的消息隊列,它由windows維護,用于初步 保存使用者從鍵盤和鼠標輸入的信息。只有當 windows應用程序處理完前一個使用者輸入消息時, windows才會從系統(tǒng)消息隊列中取出下一個消息,并 將其放入應用程序的消息隊列中。此過程分為兩步:首先在系統(tǒng)消息隊列中保存消息, 然后將它們放入應用程序的消息隊列,其原因是需要 同步。就像我們剛才所學的,假定接收鍵盤輸入的窗 口就是有輸入焦點的窗口。使用者的輸入速度可
10、能比 應用程序處理按鍵的速度快,并且特定的按鍵可能會 使焦點從一個窗口切換到另一個窗口,后來的按鍵就 輸入到了另一個窗口。但如果后來的按鍵已經(jīng)記下了 目標窗口的地址,并放入了應用程序消息隊列,那么 后來的按鍵就不能輸入到另一個窗口。按鍵和字符應用程序從windows接收的關(guān)于鍵盤事件的消息可以 分為按鍵和字符兩類,這與您看待鍵盤的兩種方式一致。首先,您可以將鍵盤看作是鍵的集合。鍵盤只有唯一 的a鍵,按下該鍵是一次按鍵,釋放該鍵也是一次按 鍵。但是鍵盤也是能產(chǎn)生可顯示字符或控制字符的輸 入設備。根據(jù)ctrk shift和caps lock鍵的狀態(tài),a 鍵能產(chǎn)生幾個字符。通常情況下,此字符為小寫a
11、。 如果按下shift鍵或者打開了 caps lock,則該字符就 變成大寫ao如果按下了 ctrl,則該字符為ctrl-a (它 在ascii中有意義,但在windows中可能是某事件的 鍵盤快捷鍵)。在一些鍵盤上,a按鍵之前可能有死 字符鍵(dead-character key)或者 shift> ctrl 或者 alt 的不同組合,這些組合可以產(chǎn)生帶有音調(diào)標記的小寫 或者大寫,例如,d、d>狡20.、或擰?/p>對產(chǎn)生可顯示字符的按鍵組合,windows不僅給程序 發(fā)送按鍵消息,而且還發(fā)送字符消息。有些鍵不產(chǎn)生 字符,這些鍵包括shift鍵、功能鍵、光標移動鍵和特 殊字
12、符鍵如insert和delete o對于這些鍵,windows 只產(chǎn)生按鍵消息。按鍵消息 當您按下一個鍵時,windows把wm_keydown或 者wm_syskeydown消息放入有輸入焦點的窗口 的消息隊列;當您釋放一個鍵時,windows把 wm_keyup或者 wm_syskeyup消息放入消息隊 列中。表6-1鍵按下鍵釋放非系統(tǒng)鍵wm keydownwm keyup系統(tǒng)鍵wm_syskeydownwm_syskeyup通常rdown (按下)和up (放開)消息是成對出 現(xiàn)的。不過,如果您按住一個鍵使得自動重復功能生 效,那么當該鍵最后被釋放時,windows會給窗口消 息處理程序
13、發(fā)送一系列 wm_keydown (或者 wm_syskeydown)消息和一個 wm_keyup (或 者wm_syskeyup)消息。像所有放入隊列的消息 一樣,按鍵消息也有時間信息。通過呼叫 getmessagetime,您可以獲得按下或者釋放鍵的相對 時間。系統(tǒng)按鍵與非系統(tǒng)按鍵wm_syskeydown 和 wm_syskeyup 中的sys 代表系統(tǒng),它表示該按鍵對windows比對windows 應用程序更加重要。wm_syskeydown 和 wm_syskeyup消息經(jīng)常由與alt相組合的按鍵產(chǎn) 牛,這些按鍵啟動程序菜單或者系統(tǒng)菜單上的選項, 或者用于切換活動窗口等系統(tǒng)功能(a
14、lt-tab或者 alt-esc),也可以用作系統(tǒng)菜單快捷鍵(alt鍵與一個功能鍵相結(jié)合,例如alt-f4用于關(guān)閉應用程序)。程序通常忽wm_syskeyup 和wm_syskeydown 消息,并將它們傳送到defwindowproc o由于 windows要處理所有 alt鍵的功能,所以您無需攔截這些消息。您的窗口消息處理 程序?qū)⒆詈笫盏疥P(guān)于這些按鍵結(jié)果(如菜單選擇)的 其它消息。如果您想在自己的窗口消息處理程序中加 上攔截系統(tǒng)按鍵的程序代碼(如本章后面的keyview1和keyview2程序所作的那樣),那么在處理這些消息之后再傳送到defwindowproc ,windows就仍然可以
15、將它們用于通常的目的。但是,請再考慮一下,兒乎所有會影響使用者程序窗 口的消息都會先通過使用者窗口消息處理程序。只有使用者把消息傳送到defwindowproc, windows才會對消息進行處理。例如,如果您將下面幾行敘述:casewm_syskeydown:casewm_syskeyup:casewm.syschar:return 0 ;加入到一個窗口消息處理程序中,那么當您的程序主 窗口擁有輸入焦點時,就可以有效地阻止所有alt鍵 操作(我將在本章的后面討論wm_syschar),其 中包括alt-tab> alt-esc以及菜單操作。雖然我懷疑 您會這么做,但是,我相信您會感到窗
16、口消息處理程 序的強大功能。wm_keydown和 wm_keyup消息通常是在按下 或者釋放不帶alt鍵的鍵時產(chǎn)生的,您的程序可以使 用或者忽略這些消息,windows本身并不處理這些消 對所有四類按鍵消息,wparam是虛擬鍵代碼,表示按 下或釋放的鍵,而iparam則包含屬于按鍵的其它數(shù) 據(jù)。虛擬鍵碼虛擬鍵碼保存在 wm_keydown、wm_keyup、 wm_syskeydown 和 wm_syskeyup 消息的 wparam參數(shù)中。此代碼標識按下或釋放的鍵。哈,又是虛擬,您喜歡這個詞嗎?虛擬指的是假定 存在于思想中而不是現(xiàn)實世界中的一些事物,也只有 熟練使用dos匯編語言編寫應用
17、程序的程序?qū)懽髡?才有可能指出,為什么對windows鍵盤處理如此基本 的鍵碼是虛擬的而不是真實的。對于早期的程序?qū)懽髡邅碚f,真實的鍵碼由實際鍵盤 硬件產(chǎn)生。在windows文件中將這些鍵碼稱為掃描 碼(scan codes) j o在ibm兼容機種上,掃描碼16是q 鍵,17是w鍵,18是e、19是r, 20是t, 21是y 等等。這時您會發(fā)現(xiàn),掃描碼是依據(jù)鍵盤的實際布局 的owindows開發(fā)者認為這些代碼過于與設備相關(guān)了, 于是他們試圖通過定義所謂的虛擬鍵碼,以便經(jīng)由與 設備無關(guān)的方式處理鍵盤。其中一些虛擬鍵碼不能在 ibm兼容機種上產(chǎn)生,但可能會在其它制造商生產(chǎn)的 鍵盤中找到,或者在未
18、來的鍵盤上找到。您使用的大多數(shù)虛擬鍵碼的名稱在winuser.h表頭 文件中都定義為以vk_開頭。表6-2列出了這些名稱 和數(shù)值(十進制和十六進制),以及與虛擬鍵相對應的 ibm兼容機種鍵盤上的鍵。下表也標出了 windows 執(zhí)行時是否需要這些鍵。下表還按數(shù)字順序列出了虛 擬鍵碼。前四個虛擬鍵碼中有三個指的是鼠標鍵:表6-2十進制十六進制winuser.h標識符必需?ibm兼容鍵盤01vk_lbutton鼠標左鍵02vk_rbutton鼠標右鍵303vk_cancelctrl-break04vk_mbutton鼠標中鍵您永遠都不會從鍵盤消息中獲得這些鼠標鍵代碼。在 下一章可以看到,我們能夠從
19、鼠標消息中獲得它們。vk_cancel代碼是一個虛擬鍵碼,它包括同時按下 兩個鍵(ctrl-break) 0 windows應用程序通常不使用此 鍵。表 6-3 中的鍵backspace> tab> enter> escape 和 spacebar一通常用于 windows 程序。不過,windows 一般用字符消息(而不是鍵盤消息)來處理這些鍵。表6-3十進制十六進制winuser.h標識符必需?ibm兼容鍵盤08vk_backbackspace909vk_tabtab12ocvk_clearnum lock關(guān)閉時的數(shù)字鍵盤513odvk return7enter (或者另
20、一個)1610vk_shiftshift (或者另一個)1711vk_controlctrl (或者另一個)18vk menualt (或者另一個)1913vk_pausepausevk capitalcaps lock27ibvk_escapeesc3220vk_spacespacebar另夕卜,windows程序通常不需要監(jiān)視shift> ctrl或alt 鍵的狀態(tài)。表6-4列出的前八個碼可能是與vk_insert和 vk.delete 一起最常用的虛擬鍵碼:表64 十進制十六進制winuser.h標識符必需?ibm兼容鍵盤33vk prior7page up3422vk_next3
21、523vk_endend3624vk homehome3725vk.left左箭頭26vk_up上箭頭3927vk_right右箭頭4028vk_down下箭頭41vk select422avk_print432bvk execute442cvk_snapshotprint screen452dvk insert7insert462evk_deletedelete472fvk_help注意,許多名稱(例如vk_prior和vk_next)都 與鍵上的標志不同,而且也與滾動條中的標識符不統(tǒng) 一。print screen鍵在平時都被windows應用程序所忽 略。windows本身響應此鍵時會將視
22、訊顯示的位圖影 本存放到剪貼板中。假使有鍵盤提供了 vk_select、 vk_print、vk_execute 和 vk_help,大概也沒 幾個人看過那樣的鍵盤。windows也包括在主鍵盤上的字母和數(shù)字鍵的虛擬鍵 碼(數(shù)字鍵盤將單獨處理)。表6-5十進制十六進制winuser.h標識符必需?ibm兼容鍵盤48-5730-39主鍵盤上的0到965-9041-5 a無a到z注意,數(shù)字和字母的虛擬鍵碼是ascii碼。windows程序幾乎從不使用這些虛擬鍵碼;實際上,程序使用 的是ascii碼字符的字符消息。表6-6所示的代碼是由microsoft natural keyboard及 其兼容鍵
23、盤產(chǎn)生的:表6-6十進制十六進制winuser.h標識符必需?ibm兼容鍵盤915bvk_lwin左 windows 鍵925cvk rwin右 windows 鍵935dvk_appsapplications 鍵windows用vk_lwin和vk_rwin鍵打開開始 菜單或者(在以前的版本中)啟動工作管理員程序。 這兩個都可以用于登錄或注銷 windows (只在 microsoft windows nt中有效),或者登錄或注銷網(wǎng)絡 (在windows for applications中)。應用程序能夠通過 顯示輔助信息或者當成快捷方式鍵看待來處理 application 鍵。表6-7所示
24、的代碼用于數(shù)字鍵盤上的鍵(如果有的話):表6-7十進制十六進制winuser.h標識符必需?ibm兼容鍵盤96-10560-69vk_numpad0 到 vk_ numpad9numlock打開時數(shù)字鍵盤上的0到91066avk_multiply數(shù)字鍵盤上的*6bvk_add數(shù)字鍵盤上的+1086cvk_separator1096dvk_subtract數(shù)字鍵盤上的-1106evk_decimal數(shù)字鍵盤上的.ill6fvk_divide數(shù)字鍵盤上的/最后,雖然多數(shù)的鍵盤都有12個功能鍵,但windows 只需要10個,而位旗標卻有24個。另外,程序通常 用功能鍵作為鍵盤快捷鍵,這樣,它們通常
25、不處理表 6-8所示的按鍵:表68 十進制十六進制winuser.h標識符必需?ibm兼容鍵盤112-12170-79vk_f1 至u vk_f10功能鍵fl到f10122-1357a-87vk_f11 至0 vk_f24功能鍵fll到f24144vk numlocknum lock14591vk_scrollscroll lock另外,還定義了一些其它虛擬鍵碼,但它們只用于非 標準鍵盤上的鍵,或者通常在大型主機終端機上使用 的鍵。查看/ platform sdk / user interface services / user input / virtual-key codes,可得到完整的
26、列表。iparam信息在四個按鍵消息(wm_keydown、wm_keyup、 wm_syskeydown 和 wm_syskeyup )中, wparam消息參數(shù)含有上面所討論的虛擬鍵碼,而 iparam消息參數(shù)則含有對了解按鍵非常有用的其它信 息。iparam的32位分為6個字段,如圖6-1所示。圖6-1 iparam變量的6個按鍵消息字段重復計數(shù)匝復計數(shù)是該消息所表示的按鍵次數(shù),大多數(shù)悄況下, 重復計數(shù)設定為lo不過,如果按下一個鍵之后,您 的窗口消息處理程序不夠快,以致不能處理自動重復 速率(您可以在控制臺的鍵盤中進行設定) 下的按鍵消息,windows就把幾個 wm_keydown
27、或者wm_syskeydown消息組合到單個消息中, 并相應地增加重復計數(shù)。wm_keyup或 wm.syskeyup消息的重復計數(shù)總是為1。因為重復計數(shù)大于1指示按鍵速率大于您程序的處理 能力,所以您也可能想在處理鍵盤消息時忽略重復計 數(shù)。幾乎每個人都有文書處理或執(zhí)行電子表格時畫面 卷過頭的經(jīng)驗,因為多余的按鍵堆滿了鍵盤緩沖區(qū), 所以當程序用一些時間來處理每一次按鍵時,如果忽 略您程序中的重復計數(shù),就能夠解決此問題。不過, 有時可能也會用到重復計數(shù),您應該嘗試使用兩種方 法執(zhí)行程序,并從中找出一種較好的方法。oem掃描碼oem掃描碼是由硬件(鍵盤)產(chǎn)生的代碼。這對中古 時代的匯編程序?qū)懽髡邅?/p>
28、說應該很熟悉,它是從pc 相容機種的rom bios服務中所獲得的值(oem指的是pc的原始設備制造商(original equipmentmanufacturer)及其與ibm標準同步的內(nèi)容)。在此我們不需要更多的信息。除非需要依賴實際鍵盤布 局的樣貌,不然windows程序可以忽略掉幾乎所有的oem掃描碼信息,參見第二十二章的程序kbmidl擴充鍵旗標 如果按鍵結(jié)果來自ibm增強鍵盤的附加鍵之一,那么 擴充鍵旗標為1 (ibm增強型鍵盤有101或102個鍵。 功能鍵在鍵盤頂端,光標移動鍵從數(shù)字鍵盤中分離出 來,但在數(shù)字鍵盤上還保留有光標移動鍵的功能)。對 鍵盤右端的alt和ctrl鍵,以及
29、不是數(shù)字鍵盤那部分 的光標移動鍵(包括insert和delete鍵)、數(shù)字鍵盤 上的斜線(/ )和enter鍵以及num lock鍵等,此旗標均被設定為lo windows程序通常忽略擴充鍵旗標。內(nèi)容代碼右按鍵時,假如同時壓下alt鍵,那么內(nèi)容代碼為lo 對 wm_syskeyup 與 wm_syskeydown 而言, 此位總視為 1 ; 而對 wm_syskeyup 與wm.keydow消息而言,此位為0。除了兩個之外:*如果活動窗口最小化了,則它沒有輸入焦點。 這時候所有的按鍵都會產(chǎn)生wm_syskeyup和 wm_syskeydown消息。如果alt鍵未被按下,則 內(nèi)容代碼字段被設定為
30、0。windows使用 wm_syskeyup 和 wm_syskeydown 消息,從 而使最小化了的活動窗口不處理這些按鍵。*對于一些外國語文(非英文)鍵盤,有些字符 是通過shift> ctrl或者alt鍵與其它鍵相組合而產(chǎn)生 的。這時內(nèi)容代碼為1,但是此消息并非系統(tǒng)按鍵消鍵的先前狀態(tài)如果在此之前鍵是釋放的,則鍵的先前狀態(tài)為0,否 則為 1。對 wm_keyup 或者 wm_syskeyup 消息, 它總是設定為1;但是對 wm_keydown或者 wm_syskeydown消息,此位可以為0,也可以為 lo如果為1,則表示該鍵是自動重復功能所產(chǎn)生的第 二個或者后續(xù)消息。轉(zhuǎn)換狀態(tài)
31、如果鍵正被按下,則轉(zhuǎn)換狀態(tài)為0;如果鍵正被釋放, 則轉(zhuǎn)換狀態(tài)為1。對 wm_keydown 或者 wm_syskeydown 消息,此 字段為 0 ;對 wm_keyup或者 wm_syskeyup消息,此字段為 lo位移狀態(tài)在處理按鍵消息時,您可能需要知道是否按下了位移 鍵(shift、ctrl 和 alt)或開關(guān)鍵(caps lock、num lock 和scroll lock)o通過呼叫g(shù)etkeystate函數(shù),您就能 獲得此信息。例如:istate = getkeystate (vk.shift);如果按下了 shift,則istate值為負(即設定了最高位 置位)o如果caps l
32、ock鍵打開,則從istate = getkeystate (vk_capital);傳回的值低位被設為lo此位與鍵盤上的小燈保持一致。通常,您在使用getkeystate時,會帶有虛擬鍵碼 vk_shift、vk_control 和 vk_menu (在說明 alt鍵時呼叫)。使用getkeystate時,您也可以用下 面的標識符來確定按下的shift> ctrl或alt鍵是左邊 的還是右邊的:vk_lshift、 vk_rshift、 vkjlcontrol、vk_rcontrol、vk_lmenu、 vk_rmenuo這些標識符只用于getkeystate和 getasynckey
33、state (下面將詳細說明)。使用虛擬鍵碼 vk_lbutton、vk_rbutton 和 vk_mbutton,您也可以獲得鼠標鍵的狀態(tài)。不過, 大多數(shù)需要監(jiān)視鼠標鍵與按鍵相組合的windows應用 程序都使用其它方法來做到這一點一即在接收到鼠標 消息時檢查按鍵。實際上,位移狀態(tài)信息包含在鼠標 信息中,正如您在下一章中將看到的一樣。請注意getkeystate的使用,它并非實時檢查鍵盤狀 態(tài),而只是檢查直到目前為止正在處理的消息的鍵盤 狀態(tài)。多數(shù)情況下,這正符合您的要求。如果您需要 確定使用者是否按下了 shift-tab,請在處理tab鍵的wm_keydown消息時呼叫g(shù)etkeysta
34、te,帶有參數(shù) vk_shifto如果getkeystate傳回的值為負,那么您 就知道在按下tab鍵之前按下了 shift鍵。并且,如果 在您開始處理tab鍵之前,已經(jīng)釋放了 shift鍵也沒有 關(guān)系。您知道,在按下tab鍵的時候shift鍵是按下的。getkeystate不會讓您獲得獨立于普通鍵盤消息的鍵 盤信息。例如,您或許想暫停窗口消息處理程序的處 理,直到您按下f1功能鍵為止:while (getkeystate (vk_f1) >= 0);/ wrong !不要這么做!這將讓程序當死(除非在執(zhí)行此敘述之 前早就從消息隊列中接收到了 f1的 wmlkeydown)。如果您確實需
35、要知道目前某鍵的 狀態(tài),那么您可以使用getasynckeystate0使用按鍵消息如果程序能夠獲得每個按鍵的信息,這當然很理想, 但是大多數(shù)windows程序忽略了幾乎所有的按鍵,而 只處理部分的按鍵消息。wm_syskeydown和 wm_syskeyup消息是由windows系統(tǒng)函數(shù)使用 的,您不必為此費心,就算您要處理wm_keydown 消息,通常也可以忽略wm_keyup消息。windows程序通常為不產(chǎn)生字符的按鍵使用 wm_keydown消息。雖然您可能認為借助按鍵消 息和位移鍵狀態(tài)信息能將按鍵消息轉(zhuǎn)換為字符消息, 但是不要這么做,因為您將遇到國際鍵盤間的差異所 帶來的問題。例
36、如,如果您得到wparam等于0x33的 wm_keydown消息,您就可以知道使用者按下了 鍵3,到此為止一切正常。這時,如果用getkeystate 發(fā)現(xiàn)shift鍵被按下,您就可能會認為使用者輸入了# 號,這可不一定。比如英國使用者就是在輸入£。對于光標移動鍵、功能鍵、insert和delete鍵, wm_keydown消息是最有用的。不過,insert、 delete和功能鍵經(jīng)常作為菜單快捷鍵。因為windows 能把菜單快捷鍵翻譯為菜單命令消息,所以您就不必 自己來處理按鍵。在windows之前的ms-dos應用程序中大量使用功能 鍵與shift. ctrl和alt鍵的組合
37、,同樣地,您也可以 在windows程序中使用(實際上,microsoft word將 大量的功能鍵用作命令快捷方式),但并不推薦這樣 做。如果您確實希望使用功能鍵,那么這些鍵應該是 重復菜單命令。windows的日標之一就是提供不需要 記憶或者使用復雜命令流程的使用者接口。因此,可以歸納如下:多數(shù)情況下,您將只為光標移 動鍵(有時也為insert和delete鍵)處理 wm_keydown消息。在使用這些鍵的時候,您可 以通過getkeystate來檢查shift鍵和ctrl鍵的狀態(tài)。 例如,windows程序經(jīng)常使用shift與光標鍵的組合鍵 來擴大文書處理里選中的范圍。ctrl鍵常用于修改光 標鍵的意義。例如,ctrl與右箭頭鍵相組合可以表示 光標右移一個字。決定您的程序中使用鍵盤方式的最佳方法之一是了解 現(xiàn)有的windows程序使用鍵盤的方式。如果您不喜歡 那些定義,當然可以對其加以修改,但是這樣做不利 于其它人很快地學會使用您的程序。為sysm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社交媒體運營總結(jié)
- 二零二五年度企業(yè)財務報表分析及投資建議合同范本3篇
- 二零二五年度購物中心物業(yè)管理合同延期及消防設施補充協(xié)議范本3篇
- 二零二五年度個人消費貸款合同貸后管理服務標準4篇
- 二零二五版水電站經(jīng)營權(quán)承包與電力價格協(xié)商合同3篇
- 報銷流程及相關(guān)知識培訓
- 豐富教學手段增強學生語文素養(yǎng)
- 二零二五年度個人合伙清算協(xié)議書(清算期間債務重組)4篇
- 新課標人教版小學語文六年級下冊復習題及答案
- 二零二五版水利工程臨時設施搭建勞務分包合同示范文本3篇
- 普外科一科一品一特色科室活動方案
- 蘇教版六年級數(shù)學下冊第四單元大單元教學設計
- 北師大版七年級上冊數(shù)學思維導圖全套
- 13《馬說》(原卷版)-2023年中考課標文言文20篇專項訓練
- Python快速編程入門(第2版)完整全套教學課件
- 污水處理設施設備升級改造項目資金申請報告-超長期特別國債投資專項
- 簡易勞務承包合同范本
- 高中政治必刷題 高考真題 必修3《政治與法治》(原卷版)
- 檢驗員績效考核
- 2024年考研政治試題及詳細解析
- 農(nóng)藥合成研發(fā)項目流程
評論
0/150
提交評論