關於鍵盤快速鍵

快速鍵與功能表緊密相關, 兩者都會為使用者提供應用程式命令集的存取權。 一般而言,使用者依賴應用程式的功能表來瞭解命令集,然後在應用程式更熟悉時切換至使用快速鍵。 快速鍵提供比功能表更快速、更直接的命令存取。 應用程式至少應該提供較常用命令的加速器。 雖然快速鍵通常會產生以功能表項目的形式存在的命令,但它們也可以產生沒有對等功能表項目的命令。

本節涵蓋下列主題。

快速鍵資料表

快速鍵資料表是由 ACCEL 結構的陣列所組成,每個結構都會定義個別的加速器。 每個 ACCEL 結構都包含下列資訊:

  • 快速鍵的按鍵組合。
  • 加速器的識別碼。
  • 各種旗標。 這包括一個 ,指定系統是否要在使用快速鍵時反白顯示對應的功能表項目來提供視覺回饋

若要處理指定執行緒的快速鍵擊,開發人員必須在與執行緒訊息佇列相關聯的訊息迴圈中呼叫 TranslateAccelerator 函式。 TranslateAccelerator 函式會監視訊息佇列的鍵盤輸入,檢查按鍵組合是否符合快速鍵資料表中的專案。 當 TranslateAccelerator找到相符專案時,它會將鍵盤輸入轉譯為 (,也就是WM_KEYUP和WM_KEYDOWN訊息) 成WM_COMMANDWM_SYSCOMMAND訊息,然後將訊息傳送至指定視窗的視窗程式。 下圖顯示如何處理快速鍵。

鍵盤快速鍵處理模型

WM_COMMAND訊息包含導致TranslateAccelerator產生訊息之加速器的識別碼。 視窗程式會檢查識別碼來判斷訊息的來源,然後據以處理訊息。

快速鍵資料表存在於兩個不同的層級。 系統會維護適用于所有應用程式的單一全系統加速器資料表。 應用程式無法修改系統加速器資料表。 如需系統加速器資料表所提供之快速鍵的描述,請參閱 加速器按鍵指派

系統也會維護每個應用程式的快速鍵資料表。 應用程式可以定義任意數目的快速鍵資料表,以搭配自己的視窗使用。 HACCEL) 唯一的 32 位句 (柄可識別每個資料表。 不過,指定的執行緒一次只能使用一個快速鍵資料表。 傳遞至 TranslateAccelerator 函式之快速鍵資料表的控制碼會決定執行緒作用中的快速鍵資料表。 使用中的快速鍵資料表可以隨時透過傳遞不同的快速鍵資料表控制碼來變更 TranslateAccelerator

建立Accelerator-Table

建立應用程式的快速鍵資料表需要數個步驟。 首先,資源編譯器可用來建立加速器資料表資源,並將其新增至應用程式的可執行檔。 在執行時間, LoadAccelerators 函式 可用來將快速鍵資料表載入記憶體中,並擷取加速器資料表的控制碼。 此控制碼會傳遞至 TranslateAccelerator 函 式,以啟動快速鍵資料表。

您也可以在執行時間為應用程式建立快速鍵資料表,方法是將 ACCEL 結構的陣列傳遞至 CreateAcceleratorTable 函式。 這個方法支援應用程式中的使用者定義加速器。 如同LoadAccelerators 函式,CreateAcceleratorTable會傳回可傳遞至TranslateAccelerator以啟動快速鍵資料表的快速鍵資料表控制碼。

系統會自動終結 LoadAccelerators 所載入的快速鍵資料表,或由 CreateAcceleratorTable所建立。 不過,應用程式可以藉由呼叫 DestroyAcceleratorTable 函式,藉此終結快速鍵資料表而不再需要資源來釋放資源。

可以複製和修改現有的快速鍵資料表。 使用 CopyAcceleratorTable 函式複製現有的快速鍵資料表。 修改複本之後,會呼叫 CreateAcceleratorTable來擷取新快速鍵資料表的控制碼。 最後,控制碼會傳遞至 TranslateAccelerator 以啟動新的資料表。

快速鍵按鍵指派

ASCII 字元碼或虛擬機器碼程式碼可用來定義快速鍵。 ASCII 字元碼會使快速鍵區分大小寫。 因此,使用 ASCII 「C」 字元會將快速鍵定義為 ALT+C,而不是 ALT+c。 不過,區分大小寫的加速器可能會混淆使用。 例如,如果 CAPS LOCK 鍵關閉或 SHIFT 鍵關閉,但兩者都關閉,則會產生 ALT+C 快速鍵。

一般而言,快速鍵不需要區分大小寫,因此大部分的應用程式會針對加速器使用虛擬金鑰碼,而不是 ASCII 字元碼。

避免與應用程式功能表助憶鍵衝突的快速鍵,因為快速鍵會覆寫助憶鍵,這可能會混淆使用者。 如需功能表助憶鍵的詳細資訊,請參閱 功能表

如果應用程式定義也定義于系統加速器資料表中的快速鍵,則應用程式定義的加速器會覆寫系統加速器,但只會在應用程式的內容中。 不過,請避免這種做法,因為它可防止系統加速器在使用者介面中執行其標準角色。 全系統加速器會在下列清單中描述:

加速器 描述
ALT+ESC 切換至下一個應用程式。
ALT+F4 關閉應用程式或視窗。
ALT+連字號 開啟文件視窗的 [ 視窗 ] 功能表。
ALT+列印畫面 將使用中視窗中的影像複製到剪貼簿。
ALT 鍵 + 空格鍵 開啟應用程式主視窗的 [ 視窗 ] 功能表。
ALT+TAB 切換至下一個應用程式。
Ctrl+Esc 切換至 [ 開始] 功能表。
CTRL+F4 關閉使用中的群組或文件視窗。
F1 如果應用程式存在,請啟動應用程式的說明檔。
PRINT SCREEN 將畫面上的影像複製到剪貼簿。
SHIFT+ALT+TAB 切換至先前的應用程式。 使用者必須按下 TAB 鍵並按住 ALT+SHIFT。

 

快速鍵和功能表

使用快速鍵與選擇功能表項目相同:這兩個動作都會讓系統將 WM_COMMANDWM_SYSCOMMAND 訊息傳送至對應的視窗程式。 WM_COMMAND訊息包含視窗程式檢查以判斷訊息來源的識別碼。 如果加速器產生 WM_COMMAND 訊息,識別碼就是加速器的識別碼。 同樣地,如果功能表項目產生 WM_COMMAND 訊息,識別碼就是功能表項目的識別碼。 因為快速鍵提供從功能表選擇命令的快捷方式,所以應用程式通常會將相同的識別碼指派給快速鍵和對應的功能表項目。

應用程式會以與對應功能表項目WM_COMMAND訊息完全相同的方式處理快速鍵WM_COMMAND訊息。 不過, WM_COMMAND 訊息包含一個旗標,指定訊息源自快速鍵還是功能表項目,以防快速鍵必須與其對應的功能表項目不同處理。 WM_SYSCOMMAND訊息不包含此旗標。

識別碼會決定加速器會產生 WM_COMMANDWM_SYSCOMMAND 訊息。 如果識別碼的值與 [系統] 功能表中的功能表項目相同,快速鍵會產生 WM_SYSCOMMAND 訊息。 否則,加速器會產生 WM_COMMAND 訊息。

如果快速鍵的識別碼與功能表項目相同,且功能表項目呈現灰色或停用,則會停用快速鍵,且不會產生 WM_COMMANDWM_SYSCOMMAND 訊息。 此外,如果對應的視窗最小化,加速器就不會產生命令訊息。

當使用者使用對應至功能表項目的快速鍵時,視窗程式會收到 WM_INITMENUWM_INITMENUPOPUP 訊息,就像使用者已選取功能表項目一樣。 如需如何處理這些訊息的詳細資訊,請參閱 功能表

對應至功能表項目的快速鍵應該包含在功能表項目的文字中。

UI 狀態

Windows 可讓應用程式在其 UI 中隱藏或顯示各種功能。 這些設定稱為 UI 狀態。 UI 狀態包含下列設定:

  • 焦點指標 (,例如按鈕上的焦點矩形)
  • 鍵盤快速鍵 (控制項標籤中以底線表示)

視窗可以傳送訊息來要求 UI 狀態的變更、查詢 UI 狀態,或為其子視窗強制執行特定狀態。 這些訊息如下所示。

訊息 描述
WM_CHANGEUISTATE 表示 UI 狀態應該變更。
WM_QUERYUISTATE 擷取視窗的 UI 狀態。
WM_UPDATEUISTATE 變更 UI 狀態。

 

根據預設,會建立最上層視窗的所有子視窗,其 UI 狀態與父視窗相同。

系統會處理對話方塊中控制項的 UI 狀態。 在對話方塊建立時,系統會據以初始化 UI 狀態。 所有子控制項都會繼承此狀態。 建立對話方塊之後,系統會監視使用者的按鍵。 如果隱藏 UI 狀態設定,而且使用者會使用鍵盤流覽,則系統會更新 UI 狀態。 例如,如果使用者按下 Tab 鍵將焦點移至下一個控制項,系統會 呼叫 WM_CHANGEUISTATE 讓焦點指標可見。 如果使用者按下 ALT 鍵,系統 會呼叫 WM_CHANGEUISTATE ,讓鍵盤快速鍵可見。

如果控制項支援在其包含的 UI 元素之間巡覽,它可以更新自己的 UI 狀態。 控制項可以呼叫 WM_QUERYUISTATE 來擷取和快取初始 UI 狀態。 每當控制項收到 WM_UPDATEUISTATE 訊息時,它可以更新其 UI 狀態,並將 WM_CHANGEUISTATE 訊息傳送至其父代。 每個視窗都會繼續將訊息傳送至其父系,直到到達最上層視窗為止。 最上層視窗會將 WM_UPDATEUISTATE 訊息傳送至視窗樹狀結構中的視窗。 如果視窗未傳遞 WM_CHANGEUISTATE 訊息,則不會到達最上層視窗,且不會更新 UI 狀態。